Android Terminology • Component: Activities, content providers, broadcast receivers, and services that together make up an application • • • • • • • • Activity: A single user-based task, usually, but not always, containing views Content Provider: A component that serves data to other applications Broadcast receiver: Component receiving notifications from other activities Service: Background process responding local or remote application requests View: Base class for most layout components UI Control: textView, EditText, CheckBox, RadioButton, Spinner, etc. Layout: Visual arrangement of containers and views Context: Object containing the global state of an application environment • Intent: Asynchronous launching (or communication) message • Intent Filter: Criteria an Android device uses to find matching activities Android Terminology (cont.) • Preference: A key/value pair, which defines a user option • Context Menu: A menu executing after a long click • Long Click: Analogous to right clicks; Hold click for approximately two seconds • Modal: Dialog requiring a response before continuing an activity • Localize: Separate data from an application, so changes don't require changing source. Refer to the data by an identifier name. • Faded Edge: An edge of a scrollable area that is faded to indicate that more information exists • Fragment: An independent module tightly bound to an application • Bundle: A set of key/value data pairs for persisting an application state Android Terminology (cont.) • Gravity: Determine alignment of text within a view of different size. Values can include: top, bottom, left, center, fill • Content Provider: Wrapper for data, exposing data (SQL for example) to multiple applications, using a standard API. • Cursor: An object containing rows extracted from an SQL table • Projection: The columns of an SQL table of interest • Live Folder: Deprecated mechanism to display data on home page – Developers now use Widgets – Live: updates display automatically • Widgets: Miniature icon-based application view (clock, battery charge percent) embedded on the home screen or application • Live Wallpaper: Dynamic interactive home screen backgrounds Creating an Android Application Perform the following steps 1. Create a new Android project in Eclipse with the wizard icon 2. Register activities, specify Content Providers, Services, and security specifications in AndroidManifest.xml 3. Create localized literals in the res/values directory 4. Create other resources in various res directories 5. Create UI layouts in the res/layouts directory 6. Code the activity java class in the package folder Step 1: Eclipse Android Project Wizard • First Screen – Name the project – Use workspace or browse to a new location • Second Screen: Pick an Android version – The oldest version has the most compatibility – Newer versions obviously have more features – Some newer features are backwards compatible • Third Screen: Pick a package name – Example: com.acorns.lesson or com.cs415.name • Click finish to complete the process Android Application Project Structure Automatically Generated Files package com.paad.helloworld; public final class BuildConfig { public final static boolean DEBUG = true; } package com.paad.helloworld;public final class R { public static final class attr { } public static final class drawable { public static final int ic_launcher=0x7f020000; } public static final class layout { public static final int main=0x7f030000; } public static final class string { public static final int app_name=0x7f040001; public static final int hello=0x7f040000; } } Step 2: Create the Manifest • The new project wizard – Automatically Creates a default AndroidManifest.xml file – Creates a default activity in the project directory • Alter the manifest – Register activities with intents, permissions, content providers, services, etc. – There are two possibilities Edit the manifest directly Use the Manifest Editor that displays when clicking the AndroidManifest.xml file HelloWorld Manifest <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.paad.helloworld" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="1" // User cannot install if less (1=default) android:targetSdkVersion="15" /> // Verify features between min & target <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:label="@string/app_name" android:name=".MyActivity" > <intent-filter > <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> Step 2: Register Activities Definition: A focused single task • How? Alter the manifest! – Create additional activities – Create and/or fragments with intents, permissions, content providers, services, etc. – There are two possibilities Edit the manifest directly Use the GUI that displays when clicking the AndroidManifest.xml file (Double click AndroidManifest.xml, click on application, scroll down and click on add, Choose activity from the dropdown, give it a name, and click finish to start coding) Intent Definition: Messages that asynchronously launch or communicate with other applications/activities • Android Intent Resolver – Applications sends intents to the Android system – The Android intent resolver searches all application intent filters to find the most suitable matching activity – Intents can target a single application or multiple applications broadcast for sequential handling • Intent Filters – Intent fields contain criteria fields defining whether an activity is appropriate – Criteria fields include actions, a category, path to data, MIME type, a handling class, and security restrictions More Details later Manifest Intent Filter Example Note: An intent launches an activity <intent-filter> The Main Entry when a user launches the application <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter><intent-filter> Launched by other applications for list access <action android:name="android.intent.action.VIEW" /> <action android:name="android.intent.action.EDIT" /> <action android:name="android.intent.action.PICK" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="vnd.android.cursor.dir/vnd.google.note" /> </intent-filter><intent-filter> Launched by other applications for single item access <action android:name="android.intent.action.GET_CONTENT" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="vnd.android.cursor.item/vnd.google.note" /> </intent-filter> Providing Access to NotePad Data <intent-filter> <action android:name="android.intent.action.VIEW" /> <action android:name="android.intent.action.EDIT" /> <action android:name="android.intent.action.PICK" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="vnd.android.cursor.dir/vnd.google.note" /> </intent-filter> • Declares legal activity operations on a note directory. • URI, vnd.android.cursor.dir/vnd.google.note , retrieves a cursor of zero or more items (vnd.android.cursor.dir) with note pad data (vnd.google.note). • Legal actions: view or edit the directory of data (VIEW and EDIT ), or pick and return a particular note (PICK). • Activities launched without a explicit package name require the DEFAULT category, or they will not be resolved Another Android Manifest <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.bikerolas" android:versionCode="30" android:versionName="1.2"> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name="android.permission.ACCESS_LOCATION /> <uses-permission android:name="android.permission.ACCESS_GPS" /> <uses-permission android:name="android.permission. ACCESS_CELL_ID /> <application android:icon="@drawable/flingicn1" android:label="@string/app_name" android:debuggable="false"> <activity android:name=".Fling" android:label="@string/app_name"> <intent-filter><action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <service android:name=".FlingService" /> <receiver android:name=".FlingServiceManager" android:permission="android.permission.RECEIVE_BOOT_COMPLETED"> <intent-filter><action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver></application><uses-sdk android:minSdkVersion="2"></uses-sdk> </manifest> Note: ACCESS_LOCATION and ACCESS_GPS were used by earlier Android versions and are now deprecated Localize Strings How? Create XML files in the res/values directory Why? Promotes Internationalize and easier maintenance Example (Strings.xml) <?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">Hello World, MyActivity!</string> <string name="app_name">PA4AD_Ch02_Hello_World</string> </resources> • Build: Android creates gen/<packageName>/R.java automatically from the information in res/Strings.xml • Java Access: setTitle(getText(R.string.hello)); • Manifest XML Access: android:label="@string/app_name" Layout Example (main.xml) How? Store xml text files in the res/layouts directory <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> </LinearLayout> Notes • fill_parent (or match_parent Android 2.0 and later) fill the entire space of the parent layout • Wrap_content uses as little space as needed • LinearLayout is a vertical or horizontal list of items (like BoxLayout in Swing) The Java Code package com.paad.helloworld; import android.app.Activity; import android.os.Bundle; public class MyActivity extends Activity { /** Called when the Activity is created or restarted. **/ @Override public void onCreate(Bundle savedState) { super.onCreate(savedState); setContentView(R.layout.main); } } A Bundle is a bunch of key/value pairs for Applications to restore their state after an Android termination Android Emulator • Start the Emulator from Eclipse – – – – Right click on the application Select run as and then Android application To debug: Select debug as and then Android Application After the first time, just click the run icon at the top of the Eclipse window • Important notes – The emulator takes quite a bit of time to launch; be patient – Don’t shut down the emulator between application runs. Closing leads to long start up times, and sometimes confuses Eclipse – Every Eclipse run reinstalls and re-launches the application Debugging Applications • Set debuggable="true" in the <application> tag – This is automatic when debugging in the emulator – Manually explicitly set preference to debug on a real device • Eclipse views – DDMS: Dalvik Debug Monitor Server Simulate Event: Global Positioning Service (GPS), phone calls, Short Message System (SMS), etc. – Debug: Start with "Debug as" – Execute emulator to get a terminal window and execute Linux commands to connect to SQL, execute queries, etc. – ADB (Android Debug Bridge): Debug on actual devices (if debugging enabled) using Eclipse; Note: ADB is part of the SDK platform tools • Techniques: Logcat displays console output, Trace , Breakpoints, Strict mode Enable Device Debugging • Eclipse: window>open perspective->other>DDMS • Enable debugging on device – Older devices: settings>applications>development – Newer devices: settings>about phone> tap build # seven times> back Debugging Techniques • Tracing the execution – Start: android.os.Debug.startmethodTracing("foo"); – Stop: android.os.Debug.stopMethodTracing(); – Writes output to: foo.trace on the emulator or device • Log class: – Analogous to Java: System.out.println or Javascript: Console.log – Example: Log.v("category string", "message"); • Asynchronous Alert Dialogs AlertDialog.Builder build = new AlertDialog(context); build.setTitle("Some Message"); AlertDialog ad = builder.create(); ad.show(); • Breakpoints: Set Eclipse breakpoint and use "Debug as" option Strict Mode (Android 2.3 and newer) • Report violations and IO Operations: Disk reads, disk writes, etc. • Common options when detection occurs: Write a Log message, display a dialog message, or crash the application • Example StrictMode.setVMPolicy(new StrictMode.VMPolicy.builder() .detectDiskWrites().detectLeakedSqlLiteObjects() .penaltyLog().penaltyDeath().build()); Note: The build retuns a ThreadPolicy object to the VM Policy builder • Detect if in debug mode ApplicationInfo info = getContext().getApplicationInfo(); if (info.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) { /* code here */}