Android Terminology Component: Activity

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 */}