android training deck

266
 Introduction to Andr oid Application Development Friday, December 17, 2010

Upload: kamini-kanchan

Post on 16-Jul-2015

181 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 1/266

Introduction to

Android ApplicationDevelopment

Friday, December 17, 2010

Page 2: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 2/266

Goals for the week 

• Introduce Android architecture and SDK

• Get hands-on experience with tools

• Create a few demo apps, and gain skills and

knowledge to develop your own

Friday, December 17, 2010

Page 3: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 3/266

Android devices

Wide range of:

•Manufacturers

•Providers

•Screen sizes

•Screen densities

•Keyboards

•Network capabilities

•Tablets and phonesFriday, December 17, 2010

Page 4: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 4/266

Android Technology

Friday, December 17, 2010

Page 5: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 5/266

A software stack for mobile devices

Includes:

•Operating system•Middleware

•Key applications

•SDK for writing apps

Friday, December 17, 2010

Page 6: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 6/266

Android Architecture

Friday, December 17, 2010

Page 7: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 7/266

Built-in applications

• Mail client

•Messaging (SMS) program

• Calendar and contacts

• Maps

• Web browser

• Others (depending on distribution)

Friday, December 17, 2010

Page 8: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 8/266

Application framework 

• Open development platform

•Design encourages component re-use

• Includes:

• Views (controls)

•Content providers

• Resource manager

• Activity manager

• Notification manager

Friday, December 17, 2010

Page 9: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 9/266

Core Libraries

• System C library (libc)

•Media Libraries

• Surface manager

• LibWebCore

• SGL (2D graphics engine)

•3D libraries (OpenGL ES)

• FreeType

• SQLite

Friday, December 17, 2010

Page 10: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 10/266

Android runtime

• Core libraries with most of Java’s librarycapability

• Dalvik VM: Executes Dalvik bytecode

• Each app runs in its own process

Friday, December 17, 2010

Page 11: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 11/266

Dal-what?

• Dalvik VM != JVM

•Dalvik VM is optimized for smartphone

hardware

• VM is register-based, not stack-based

•Runs its own bytecode: Dalvik Executable

(.dex) format; minimal memory footprint

• Utility converts Java bytecode into .dex

Friday, December 17, 2010

Page 12: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 12/266

Linux kernel

• Linux 2.6 kernel

• Security, memory management, process

management, networking

•Abstraction layer between hardware and

rest of software stack 

Friday, December 17, 2010

Page 13: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 13/266

ApplicationFundamentals

Friday, December 17, 2010

Page 14: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 14/266

Each app lives in its own world

• Each app runs in its own Linux process

• Each process has its own Dalvik virtualmachine

•Each app is assigned a unique Linux user ID

• Files are visible only to that one application

Friday, December 17, 2010

Page 15: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 15/266

Application components

and re-use• Individual components of one app can be

used by another, if permission is given

• App 1 can launch a component of App 2,

giving the appearance of embedding

•Apps have no single entry point; built

instead as individual components

Friday, December 17, 2010

Page 16: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 16/266

Activities

• A UI for one focused task for the user

•Examples:• Choose an item from a catalog

• Compose a text message

• Choose somebody to send a message to

•Each app has one or more activities

• They work together, but each is independent

• One activity usually starts the next

Friday, December 17, 2010

Page 17: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 17/266

ActivitiesChoose a hotel Describe the hotel Choose a room

Friday, December 17, 2010

Page 18: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 18/266

Activities

• Each is given a default window to draw in

•Usually fills the screen

• Can create other windows (like a dialog or

pop-up)

• Can create new full-screen views within thesame activity

Friday, December 17, 2010

Page 19: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 19/266

Activity stack 

• Activity A calls startActivity()

• Activity B starts and covers the screen

• User presses hardware Back button

• Activity B finishes, exposing Activity A

Friday, December 17, 2010

Page 20: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 20/266

Activity stack 

Friday, December 17, 2010

Page 21: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 21/266

Launching an activity from

Home

Text

Friday, December 17, 2010

Page 22: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 22/266

Difference between

HOME and BACK

Friday, December 17, 2010

Page 23: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 23/266

Activity lifecycle events

Activities have three main states:

• active

• paused• stopped

Friday, December 17, 2010

Page 24: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 24/266

Activity lifecycle

Friday, December 17, 2010

Page 25: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 25/266

Intents

•Asynchronous messages that:

• launch an activity,

• launch a service,

• or notify a broadcast receiver.

Friday, December 17, 2010

Page 26: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 26/266

Example: View a web

page

Action and data

Friday, December 17, 2010

Page 27: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 27/266

Intent object

• Component name

• Action

• Data (URL)

• Category

• Extras

• Flags

A bundle of information passed in

an intent, optionally containing:

Friday, December 17, 2010

Page 28: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 28/266

Explicit intents

Often used to start one activity from

another within the same application.

Component name

Extra data

Context reference

Friday, December 17, 2010

Page 29: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 29/266

Implicit intents

No specific application or activity is named.

Usually for activating components in other apps.

Android uses intent filters to figure out which

activity to launch, according to action, data,

and category .

Apps declare intent filters for each activity in

the manifest.

Friday, December 17, 2010

Page 30: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 30/266

Choosing an activity for an

intent

Friday, December 17, 2010

Page 31: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 31/266

Two ways to start an

activity

• startActivity(intent);

•No result returned from child

• startActivityForResult(intent, requestCode);• Child returns a result (as int and another intent)

• Child calls setResult(int)

• Caller implements onActivityResult() to get the result

Friday, December 17, 2010

Page 32: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 32/266

Application manifestAndroidManifest.xml

Names the application ID(package)

Lists theactivities, and

their attributes

Sets otheroptional

parameters

Declares requiredpermissions

Friday, December 17, 2010

Page 33: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 33/266

Activities and tasks

Task: what the user experiences as a single “application”

A group of activities, managed as a stack.

Normally, activites are only pushed/poppped, never

re-arranged.

The entire stack (task) goes foreground/

background as a unit.

Friday, December 17, 2010

Page 34: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 34/266

Flags and attributes affect

stack and task behavior

• Activities normally belong to the same task 

• FLAG_ACTIVITY_NEW_TASK: System

puts the new activity in a different task 

Friday, December 17, 2010

Page 35: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 35/266

What happens to a task in

the background?• Normally, system clears all activities except

the root activity if it’s been in the

background “a long time”.

• Boolean attributes to control this:

•alwaysRetainTaskState (root activity)

• clearTaskOnLaunch (root activity)

• finishOnTaskLaunch

Friday, December 17, 2010

Page 36: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 36/266

Three ways to shut down

an activity

this.finish();

this.finishActivity(int requestCode);

User presses BACK key

Friday, December 17, 2010

Page 37: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 37/266

Returning to the root

activity

Friday, December 17, 2010

Page 38: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 38/266

Ending a task 

The root activity finishes, either by the

user pressing BACK or the activity

calling finish() on itself.

Android itself manages the lifetime of the application!

Friday, December 17, 2010

Page 39: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 39/266

Refresher on Java

conce ts

• Nested classes

• Anonymous inner classes

Friday, December 17, 2010

Page 40: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 40/266

Nested classes

• Logically group classes that are used only in one

place.• Increase encapsulation.

• Can make code more readable and maintainable.

• Static vs non-static

Friday, December 17, 2010

Page 41: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 41/266

Anonymous inner classes

public class OuterClass { public void startThread1() { Runnable mRunnable = new Runnable() { @Override

public void run() { // do something here

} };

Thread t = new Thread(mRunnable); t.start();

};

public void startThread2() { Thread t = new Thread(new Runnable() {

@Override public void run() { // do something here

} });

t.start(); };

}

Friday, December 17, 2010

Page 42: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 42/266

Access to local variables

Friday, December 17, 2010

Page 43: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 43/266

Lab: Hello, Negotiator!(in three parts)

Friday, December 17, 2010

Page 44: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 44/266

Application resources

Friday, December 17, 2010

Page 45: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 45/266

main.xml

strings.xml

Friday, December 17, 2010

Page 46: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 46/266

Application resources

Two different devices, both using default resources:

Two different devices, one using alternative resources:

Resources should always be externalized.

Friday, December 17, 2010

Page 47: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 47/266

Organizing resources

Source and resource folder structure

Precompiler

Friday, December 17, 2010

Page 48: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 48/266

Specifying alternative

resourcesResource folder naming convention

Friday, December 17, 2010

Page 49: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 49/266

View and ViewGroup

All UIs are built with a combination of 

Views and ViewGroups.

Friday, December 17, 2010

Page 50: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 50/266

Control views (Widgets)

• Button

• TextView

• EditText

• CheckBox

• ImageView

• ListView

• RadioButton

• Spinner

• ...your own custom View

Friday, December 17, 2010

Page 51: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 51/266

Creating a custom View

Extend View directly, or extend an existing Widget:

In the XML layout, use the full class name of 

your custom view:

Friday, December 17, 2010

Page 53: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 53/266

Implementing an event listener

In your Activity class:

Friday, December 17, 2010

Page 54: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 54/266

Implementing an event listener

// Create an anonymous implementation of OnClickListener

private OnClickListener mCorkyListener = new OnClickListener() {  public void onClick(View v) {

  // do something when the button is clicked  }

};

protected void onCreate(Bundle savedValues) {  ...  // Capture our button from layout  Button button = (Button)findViewById(R.id.corky);

  // Register the onClick listener with the implementation above  button.setOnClickListener( mCorkyListener);  ...

}

As an anonymous class, and a field:

Friday, December 17, 2010

Page 55: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 55/266

Implementing an event listener

As an anonymous class, directly:

protected void onCreate(Bundle savedValues) {

  ...  // Capture our button from layout  Button button = (Button)findViewById(R.id.corky);  // Register the onClick listener with the implementation above  button.setOnClickListener(new OnClickListener() {  public void onClick(View v) {  // do something when the button is clicked  }

});  ...

}

Friday, December 17, 2010

Page 56: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 56/266

Event handler return values

Some have no return value (void)

Others return a boolean indicating whether

the event was (should be) consumed.

Friday, December 17, 2010

Page 57: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 57/266

Layouts

Friday, December 17, 2010

L t iti hild t l

Page 58: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 58/266

Layouts position child controlsfor the UI.

Major layout classes:

•FrameLayout

•LinearLayout

•RelativeLayout

•TableLayout

Layouts can re-size and re-position controls to

give a good presentation on different screen sizes

and orientations.

Friday, December 17, 2010

D fi l h XML

Page 59: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 59/266

Define layouts either in XMLor in Java code.

Friday, December 17, 2010

Page 60: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 60/266

Common View attributes

Friday, December 17, 2010

Parent view group defines which

Page 61: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 61/266

Parent view group defines whichlayout parameters are available

for each child .

Friday, December 17, 2010

Page 62: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 62/266

Units of measure

• Pixels (px)

• Density-independent pixels (dip or dp)• Based on 160 dpi; 160 dp is always one inch

• Scale-indepent pixels (sp)• Like dp, but scaled by font-size preference

• Points (pt)

• 1/72 of an inch

• Millimeters (mm)

• Inches (in)

Friday, December 17, 2010

Page 63: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 63/266

References in value strings

• Literal value

• Reference to a resource in our own package

• Reference to a resource in another package

android:padding="50dp"

android:background="#888888"

android:background="@drawable/myImage"

android:background="@color/blue"

android:background="@android:drawable/someDrawable"

Friday, December 17, 2010

Page 64: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 64/266

id

Generate a new ID value called someNewId and assign it to this item.

Use an existing ID (in our own resources).

Use an existing ID (in the standard Android namespace).

Friday, December 17, 2010

Page 65: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 65/266

layout_height and layout_width

Set the height of this item to match the height of its parent.

Make this item just high enough to enclose its content.

Set the height of this item to exactly 42 device-independent pixels.

Friday, December 17, 2010

layout margin and padding

Page 66: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 66/266

layout_margin and padding

Leave 24dp of space all around the edges of this item when

laying it out, if possible.

Leave 24dp of space at the top edge of this item when laying it

out, if possible.

Leave 24dp of all around the contents of this item, if possible.

Friday, December 17, 2010

it d l t it

Page 67: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 67/266

gravity and layout_gravity

android:gravity=

Center the content of this item within the item horizontally.

Center the content of this item within the item, both vertically

and horizontally.

Center this item within its parent, both vertically and horizontally.

Friday, December 17, 2010

background

Page 68: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 68/266

background

Set this item’s background to a solid white color.

Set this item’s background to transparent (alpha = 00).

Set this item’s background to a color named pricelineDarkBlue,

which is defined in an XML resource file.

Set this item’s background to a Drawable called mySpecialBackground,

which might be a bitmap image or an XML-defined shape.

Friday, December 17, 2010

Page 69: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 69/266

frameLayout

Friday, December 17, 2010

LinearLayout

Page 70: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 70/266

LinearLayout

Stacks child views in a vertical or horizontal line.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

  android:layout_width="fill_parent"

  android:layout_height="fill_parent"

  android:orientation="vertical"  android:gravity="center"

  android:background="@color/pricelineDarkBlue"> <Button android:text="Larry" 

android:layout_width="wrap_content"  android:layout_height="wrap_content"/>

<Button android:text="Curly"  android:layout_width="wrap_content" 

android:layout_height="wrap_content"/> <Button android:text="Moe" 

android:layout_width="wrap_content"  android:layout_height="wrap_content"/>

</LinearLayout>

Friday, December 17, 2010

Li L i f l

Page 71: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 71/266

LinearLayout is usefuland flexible.

• Horizontal and vertical LinearLayouts can

be nested to create complex layouts.

• Wrap several controls in a LinearLayout to

align or format them as a group.

•Pay close attention to gravity and

layout_gravity attributes.

Friday, December 17, 2010

T bl L

Page 72: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 72/266

TableLayout

Friday, December 17, 2010

RelativeLayout

Page 73: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 73/266

RelativeLayout

Friday, December 17, 2010

L ft d i ht li t ith

Page 74: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 74/266

Left- and right-alignment withRelativeLayout

<RelativeLayout

  xmlns:android="http://schemas.android.com/apk/res/android"  android:layout_width="fill_parent"

  android:layout_height="fill_parent"

  android:background="@color/pricelineDarkBlue">

<Button android:text="Larry"  android:id="@+id/larry"

android:layout_alignParentLeft="true" android:layout_width="wrap_content" 

android:layout_height="wrap_content"/> <Button android:text="Curly" 

android:layout_toRightOf="@id/larry" android:layout_width="wrap_content" 

android:layout_height="wrap_content"/> <Button android:text="Moe" 

android:layout_alignParentRight="true" android:layout_width="wrap_content" 

android:layout_height="wrap_content"/></RelativeLayout>

Friday, December 17, 2010

S llVi

Page 75: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 75/266

ScrollView

Friday, December 17, 2010

Page 76: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 76/266

Optimizing layouts

• Avoid unnecessary nesting

• Avoid using too many views (not more than80!)

• Avoid deep nesting (fewer than 10 levels!)

• Run the layoutopt utility on your layoutsto get recommendations for optimization

Friday, December 17, 2010

I fl l

Page 77: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 77/266

Inflating a layout

Friday, December 17, 2010

Page 78: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 78/266

Includes

One layout can include another.

Friday, December 17, 2010

Page 79: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 79/266

View stubs: lazy includes

Friday, December 17, 2010

Adding to a layout at

Page 80: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 80/266

Adding to a layout at

runtime

Friday, December 17, 2010

Page 81: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 81/266

Context

Context: Interface to global information

about an application environment

Base class of Activity, Service, and Application

getString()

getResources()getApplicationInfo()

getTheme()etc.

Friday, December 17, 2010

Page 82: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 82/266

Lab: ZipLookupPart One

Friday, December 17, 2010

M

Page 83: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 83/266

Menus

Friday, December 17, 2010

Expanded menus

Page 84: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 84/266

Expanded menus

Friday, December 17, 2010

C t t

Page 85: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 85/266

Context menu

Friday, December 17, 2010

D fi i

Page 86: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 86/266

Defining a menu

Create an XML in the /res/menu directory.

Friday, December 17, 2010

U i i h i i

Page 87: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 87/266

Using a menu in the activity

Inflate the

menu XML

Handle the

selection event

Friday, December 17, 2010

ListView

Page 88: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 88/266

ListView

Friday, December 17, 2010

Page 89: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 89/266

ListView and ListAdapter

ListView shows the list; the data comes from

ListAdapter.

Friday, December 17, 2010

Page 90: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 90/266

Standard adapters

ArrayAdapter<T>

BaseAdapter

SimpleAdapter

CursorAdapter

These all implement Adapter

Friday, December 17, 2010

Page 91: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 91/266

Using ArrayAdapter

For each item, populates a single

TextView with the value returnedby toString().

Data is defined as an array of objects.

Friday, December 17, 2010

Page 92: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 92/266

Extending ArrayAdapter

Friday, December 17, 2010

Using SimpleAdapter

Page 93: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 93/266

Using SimpleAdapter

Data is a defined as a List of Maps.Rows can have more than one field.

Friday, December 17, 2010

Extending BaseAdapter

Page 94: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 94/266

Extending BaseAdapter

Friday, December 17, 2010

O h f Ad

Page 95: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 95/266

Other uses of Adapter

Gallery, ListView, and Spinner all

extend AdapterView

Gallery: Horizontally-scrolling list locked at the center

Spinner: Drop-down list of items, like a combo box

Friday, December 17, 2010

Page 96: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 96/266

Lab: Navigator

Friday, December 17, 2010

N ifi i

Page 97: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 97/266

Notifications

• Toast Notification

Brief pop-up message from the background

• Status Bar Notification

Persistent reminder from the background thatrequests a response

• Dialog Notification

Pop-up, modal message from the activity

Friday, December 17, 2010

T

Page 98: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 98/266

Toast

Friday, December 17, 2010

T

Page 99: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 99/266

Toast

Friday, December 17, 2010

C

Page 100: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 100/266

Custom toast view

Friday, December 17, 2010

S b ifi i

Page 101: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 101/266

Status bar notifications

Status bar icons

Icon with ticker message

Notifications window

(pull down the status bar)

Some are Ongoing.

Friday, December 17, 2010

Creating a notification

Page 102: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 102/266

Creating a notification

String ns = Context.NOTIFICATION_SERVICE;

NotificationManager mNotificationManager = (NotificationManager) 

getSystemService(ns);

int icon = R.drawable.notification_icon;

CharSequence tickerText = "Hello";

long  when = System .currentTimeMillis();

Notification notification = new Notification(icon, tickerText, 

 when);

Context context = getApplicationContext();

CharSequence contentTitle = "My notification";

CharSequence contentText = "Hello World!";

Intent notificationIntent = new Intent(this, MyClass.class);

PendingIntent contentIntent = PendingIntent.getActivity(this, 0, 

notificationIntent, 0);

notification.setLatestEventInfo(context, contentTitle, 

contentText, contentIntent);

private static final int HELLO_ID = 1;

 mNotificationManager.notify(HELLO_ID, notification);

Get notification manager ref 

Instantiate notification

Define expanded message,intent

Pass to NotificationManager

Friday, December 17, 2010

O h ifi i f

Page 103: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 103/266

Other notification features

• Update existing notification

•Custom expanded viewLayout takes the place of standard title and text

• Add sound

•Add vibration

• Add flashing lights

Friday, December 17, 2010

Di l

Page 104: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 104/266

Dialogs

• AlertDialog

•ProgressDialog

• DatePickerDialog

• TimePickerDialog

Create a dialog from within onCreateDialog(int).

Friday, December 17, 2010

C ti di l

Page 105: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 105/266

Creating dialogs

static final int DIALOG_PAUSED_ID = 0; static final int DIALOG_GAMEOVER_ID = 1;

protected Dialog onCreateDialog(int id) {

Dialog dialog; switch (id) {

case DIALOG_PAUSED_ID: // do the work to define the pause Dialog

break; case DIALOG_GAMEOVER_ID:

// do the work to define the game-over Dialog break;

default: // unknown dialog

dialog = null; }

return dialog;} public void showPausedDialog() {

showDialog(DIALOG_PAUSED_ID); }

Friday, December 17, 2010

C ti Al tDi l

Page 106: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 106/266

Creating an AlertDialog

Friday, December 17, 2010

Al t di l ith li t

Page 107: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 107/266

Alert dialog with list

Friday, December 17, 2010

Si l di l

Page 108: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 108/266

Simple progress dialog

Friday, December 17, 2010

Page 109: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 109/266

Lab: Hello, NegotiatorWho Cannot Be

Ignored!

(Parts 1 and 2)

Friday, December 17, 2010

St l d Th

Page 110: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 110/266

Styles and Themes

Same idea as cascading style sheets (CSS)

Instead of this:

You can do this:

Friday, December 17, 2010

Defining styles

Page 111: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 111/266

Defining styles

Styles can inherit from other styles.

Some styles are built-in. (@android:style/*)

Custom styles go in one or more <resources> xml.

Friday, December 17, 2010

Style inheritance

Page 112: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 112/266

Style inheritance

Inherit from your own styles using dot-notation.

Friday, December 17, 2010

Style vs theme

Page 113: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 113/266

Style vs. theme

In layout.xml, style appliesto a specific View, only.

In <activity> tag inmanifest.xml, style appliesto all views in the activity.

In <application> tag inmanifest.xml, style appliesto all views in the entire

application.

Friday, December 17, 2010

Some built in themes

Page 114: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 114/266

Some built-in themes

You can use these directly, or extend them.

Theme

Theme.NoTitleBarTheme.NoTitleBar.Fullscreen

Theme.Light

Theme.Black 

Theme.TranslucentTheme.Dialog

Theme.Dialog.Alert

Friday, December 17, 2010

Dialog themes

Page 115: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 115/266

Dialog themes

res/values/styles.xml:

Friday, December 17, 2010

Page 116: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 116/266

Lab: Hello, NegotiatorWho Cannot Be

Ignored!

(Part 3)

Friday, December 17, 2010

Page 117: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 117/266

Drawables

Friday, December 17, 2010

Drawable

Page 118: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 118/266

Drawable

• BitmapDrawable

• ShapeDrawable

• PictureDrawable

• LayerDrawable

• etc.

Something that can be drawn.

Friday, December 17, 2010

Three ways to create a

Page 119: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 119/266

Drawable

• Image saved in project resources

• XML file that defines Drawable properties

• In code, using class constructors

Friday, December 17, 2010

Using image resources

Page 120: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 120/266

Using image resources

Id is image filename, without the extension

Acceptable characters: [a-z0-9_.]

Friday, December 17, 2010

Two ways to load from

Page 121: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 121/266

code

or, as Drawable:

as ImageView:

Friday, December 17, 2010

Creating from resource XML

Page 122: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 122/266

Creating from resource XML

Can be used for any Drawable

subclass that supports inflate().

Example: ShapeDrawable from Negotiator app:

Friday, December 17, 2010

Using a ShapeDrawable in a

Page 123: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 123/266

custom View

Friday, December 17, 2010

NinePatch Drawable

Page 124: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 124/266

NinePatch Drawable

Stretchable bitmap image that resizes itself cleanly.

Example: Backgrounds of standard Android buttons

Standard PNG image with extra 1-pixel border lines

Save with .9 extension in res/drawable

Friday, December 17, 2010

Caution: Each resource has

Page 125: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 125/266

only one stateResources res = getResources();

Drawable myImage1 = res.getDrawable(R.drawable.my_image);

Drawable myImage2 = res.getDrawable(R.drawable.my_image); // The following line changes the alpha for both myImage1 and myImage2.

myImage1.setAlpha(128);

Friday, December 17, 2010

Solution: mutate() method

Page 126: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 126/266

Solution: mutate() method

Resources res = getResources();

Drawable myImage1 = res.getDrawable(R.drawable.my_image);

Drawable myImage2 = res.getDrawable(R.drawable.my_image); // The following line changes the alpha for only myImage1.

myImage1.mutate().setAlpha(128);

Friday, December 17, 2010

Selector drawable

Page 127: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 127/266

Selector drawable

This could be used as the background of a button:

Friday, December 17, 2010

Color state list

Page 128: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 128/266

Color state list

Friday, December 17, 2010

Page 129: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 129/266

Animation

Friday, December 17, 2010

Animation types

Page 130: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 130/266

Animation types

• Frame animation: Rapid sequence of pre-

created frames that give the illusion of motion

• Tween animation: Series of transformations

on a View object, defined as start and end

Friday, December 17, 2010

Frame animation

Page 131: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 131/266

Frame animationBased on AnimationDrawable class

XML file goes in res/drawable:

Friday, December 17, 2010

Frame animation

Page 132: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 132/266

Frame animation

Friday, December 17, 2010

When to call start()

Page 133: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 133/266

When to call start()

• Don’t call in onCreate();

AnimationDrawable isn’t fully attached tothe window yet

• Consider onWindowFocusChanged() for

animation that starts immediately

Friday, December 17, 2010

Negotiator opening screen

Page 134: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 134/266

Negotiator opening screen

Friday, December 17, 2010

Tween animation

Page 135: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 135/266

Tween animation

• Gradually change certain properties of a

View object

• Alpha, scale, translate, rotate

• Specify, either in code or XML:

•Start and end states

• Total time

• Interpolation curve

Friday, December 17, 2010

Sample animation resource

Page 136: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 136/266

<set android:interpolator="@android:anim/decelerate_interpolator">  <scale  android:fromXScale="1.4" 

android:toXScale="0.0"  android:fromYScale="0.6"  android:toYScale="0.0" 

android:pivotX="50%" 

android:pivotY="50%" 

android:startOffset="700"  android:duration="400" 

android:fillBefore="false" />  <rotate 

android:fromDegrees="0" 

android:toDegrees="-45"  android:toYScale="0.0" 

android:pivotX="50%" 

android:pivotY="50%"  android:startOffset="700"  android:duration="400" />

</set>

Friday, December 17, 2010

Applying an animation

Page 137: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 137/266

Applying an animation

or

Friday, December 17, 2010

Interpolators

Page 138: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 138/266

p

Define the rate of change of an animation.

AccelerateInterpolator

AccelerateDecelerateInterpolator

LinearInterpolator

BounceInterpolatorOvershootInterpolator

Friday, December 17, 2010

Animation timing

Page 139: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 139/266

Animation timing

• A set of animations can be sequential orsimultaneous

• Simultaneous: Animations have same start

times

•Sequential: Time the second one to begin

after the first one ends

Friday, December 17, 2010

Sequential animations

Page 140: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 140/266

Sequential animations

<set android:interpolator="@android:anim/linear_interpolator">  <scale  android:fromXScale="1.4" 

android:toXScale="0.0"  android:fromYScale="0.6" android:toYScale="0.0" android:startOffset="0"  android:duration="500" />  <rotate 

android:fromDegrees="0" 

android:toDegrees="-45"  android:toYScale="0.0" 

android:startOffset="500"  android:duration="500" />

</set>

Friday, December 17, 2010

Page 141: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 141/266

Lab: ZipLookupPart Two (Animation)

Friday, December 17, 2010

Page 142: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 142/266

Concurrency

Friday, December 17, 2010

Threading Practices

Page 143: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 143/266

g

• Don’t block the main thread

•Perform all UI operations on main thread!

• Put long-running, non-network tasks in the

background

• Consider using asynchronous pattern formost I/O

Friday, December 17, 2010

Threads in Android

Page 144: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 144/266

• Use standard Java Thread objects (and

Runnable interfaces)

• Convenience classes for managing threads• Example: Handler for processing messages on the main

thread

Friday, December 17, 2010

What’s wrong with this?

Page 145: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 145/266

g

 public void onClick(View v) {

Bitmap b = loadImageFromNetwork();

mImageView.setImageBitmap(b);

}

Friday, December 17, 2010

OK, how about this?

Page 146: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 146/266

,

 public void onClick(View v) {

  new Thread(new Runnable() {

  public void run() {

  Bitmap b = loadImageFromNetwork();

  mImageView.setImageBitmap(b);

  }

}).start();

}

Friday, December 17, 2010

Access the UI thread from

Page 147: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 147/266

a background thread

• Activity.runOnUiThread(Runnable)

• View.post(runnable)

• View.postDelayed(Runnable, long)

• Handler

Friday, December 17, 2010

This is one solution

Page 148: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 148/266

This is one solution

Friday, December 17, 2010

Use AsyncTask 

Page 149: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 149/266

y

Friday, December 17, 2010

Sample HTTP client

Page 150: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 150/266

p

Don’t run this on the main thread;

plug it into AsyncTask instead.

Friday, December 17, 2010

Compatibility acrossA d id i

Page 151: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 151/266

Android versions

Friday, December 17, 2010

Android API levels

Page 152: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 152/266

API levels also have

nicknames like Cupcake and

Gingerbread.

Use Build.VERSION.SDK_INT

to detect API level at

runtime.

Friday, December 17, 2010

API levels in the manifest

Page 153: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 153/266

minSdkVersion

Minimum API Level required for the app to run.

targetSdkVersion

API Level on which the app is designed to run.

maxSdkVersion

Maximum API Level on which the app is able to run.(Deprecated .)

Friday, December 17, 2010

Platform version

Page 154: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 154/266

Compile against the lowest possible version

that your app can support.

Friday, December 17, 2010

Using features in newer

Page 155: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 155/266

Android versions• Check runtime platform using Build class

• Use Java reflection to load new classesand/or execute new methods

• Suggestion: Put reflection code in a

separate class

Friday, December 17, 2010

Reflection example

Page 156: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 156/266

p

Friday, December 17, 2010

Designing for performance

Page 157: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 157/266

g g p

Device has:

•Limited computing power

• Limited storage

• Limited battery life

Even if app runs fast enough, consider power!

Friday, December 17, 2010

Optimization tips

Page 158: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 158/266

p p

• Write good, well-structured and well-

layered code to begin with.

• Avoid design decisions that will limitperformance -- things that will be hard to

change later.

• Don’t guess; measure performance beforeand after optimization.

Friday, December 17, 2010

Specific tips

Page 159: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 159/266

p p

• Avoid creating objects!

• Re-use objects within a loop

• Avoid creating short-term temporaryobjects

• Prefer static over virtual (15%-20% faster)

• Avoid internal getters and setters (3x-7x

slower than direct field access)

Friday, December 17, 2010

Design for responsiveness

Page 160: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 160/266

• An app can be fast, yet still

be unresponsive

• ANR dialog if app can’trespond to user input within

5 seconds

• The main (UI) thread isprecious -- protect it!

Friday, December 17, 2010

Page 161: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 161/266

Location Services

Friday, December 17, 2010

android.location package

Page 162: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 162/266

• Get instance of LocationManager system

service

•Query for list of all installed

LocationProviders

• Register/unregister for periodic updates

from a given provider

• Register/unregister for a given Intent to fire

when we get close to something

Friday, December 17, 2010

Location awarenesschallenges

Page 163: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 163/266

challenges

• Several different location sources, all

returning different data

• The user might be moving

• For each provider, accuracy varies over

time

Friday, December 17, 2010

Requesting updates from aspecific provider

Page 164: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 164/266

specific provider

Call requestLocationUpdates() once for

each provider of interest.Friday, December 17, 2010

Typical application flow

Page 165: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 165/266

Friday, December 17, 2010

Quick fix: last knownlocation

Page 166: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 166/266

location

Returns a cached location instantly --

but it might be old!

Friday, December 17, 2010

Power-saving tips

Page 167: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 167/266

• Reduce the size of the update window

• Set the updates to return less frequently

• Use only the Network provider, rather than

the GPS provider

Friday, December 17, 2010

Page 168: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 168/266

Using abd, DDMS andLogCat

Friday, December 17, 2010

adb: Android Debug Bridge

Page 169: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 169/266

Client-server program in 3 pieces:

• Command-line client (adb)

• Server: background process on the PC

• Daemon: background process on the

emulator or device

3 pieces communicate over TCP sockets.

Friday, December 17, 2010

Sample adb commands

Page 170: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 170/266

• adb devices

• adb install something.apk

• adb uninstall appid

• adb push <local> <remote>

• adb pull <remote> <local>

• adb logcat

Friday, December 17, 2010

Remote adb shell

Page 171: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 171/266

Friday, December 17, 2010

DDMS: Dalvik DebugMonitor Server

Page 172: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 172/266

Monitor Server

• Uses adb path to connect to device

• Can connect via TCP to debug port of anyrunning VM

• Functions as “router” to connect Eclipse

debugger to selected VM

Friday, December 17, 2010

Starting DDMS

Page 173: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 173/266

From Eclipse:

Switch to DDMS perspective

From command line:

Friday, December 17, 2010

DDMS standalone

Page 174: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 174/266

Friday, December 17, 2010

Eclipse DDMS perspective

Page 175: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 175/266

Friday, December 17, 2010

Sample DDMS features

Page 176: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 176/266

• LogCat (in a window)

•Threads and allocations

• File explorer

• Screen capture

• Force a GC

Friday, December 17, 2010

Page 177: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 177/266

Profiling ApplicationPerformance

Friday, December 17, 2010

Execution trace files

Page 178: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 178/266

Generate a trace file

Copy to development machine

adb pull /sdcard/calc.trace .

Friday, December 17, 2010

Analyze a trace file

Page 179: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 179/266

traceview calc

Timeline panel:

Friday, December 17, 2010

Profile panel

Page 180: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 180/266

Friday, December 17, 2010

Page 181: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 181/266

Services

Friday, December 17, 2010

Service

Page 182: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 182/266

• An application component that doesn’t

have a user interface

• Runs on the main thread of the app, in thebackground, indefinitely

• Activities can bind to the service, start it,

stop it, and exchange data with it

• Can interact directly with other apps

Friday, December 17, 2010

What a Service isn’t:

Page 183: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 183/266

• A separate application or process

• A way to run things in a separate thread

Friday, December 17, 2010

Service lifecycle

Page 184: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 184/266

Friday, December 17, 2010

Service lifecycle methods

Page 185: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 185/266

•void onCreate()

• void onStart(Intent intent)

• void onDestroy()

Friday, December 17, 2010

Other Service callbacks

Page 186: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 186/266

• IBinder onBind(Intent intent)

•boolean onUnbind(Intent intent)

• void onRebind(Intent intent)

IBinder: Communications channel used by clients tointeract with the service

Friday, December 17, 2010

Binding to a service

Page 187: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 187/266

• Clients call Context.bindService()

• Creates the service if not already running

• Returns an IBinder object

• Service remains running at least until all clients

disconnect

Friday, December 17, 2010

Service permissions

Page 188: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 188/266

• Manifest contains a <service> tag

• Service can declare its own, home-made<permission> item in this tag

• If so, any app that wants to connect needs

a matching <uses-permission> tag

Friday, December 17, 2010

Simple example: Service runningin same process as its clients

Page 189: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 189/266

p

Friday, December 17, 2010

Simple example (continued)

Page 190: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 190/266

Friday, December 17, 2010

Client that uses service

Page 191: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 191/266

Friday, December 17, 2010

Remote client bindingoptions

Page 192: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 192/266

p

• Use AIDL

• Complete interface definition that you define

in an .aidl file

• Tools will generate stub and proxy classes

• Use Messenger class

• Connects to a local Handler to exchange

messages across processes

Friday, December 17, 2010

Service syntax in manifest

Page 193: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 193/266

On the same level as <activity> declarations:

Friday, December 17, 2010

Page 194: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 194/266

Content providers

Friday, December 17, 2010

Store and retrieve dataacross applications

Page 195: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 195/266

across applications

• Android doesn’t support direct sharing of 

files

• Some content providers are built in, likeimage library, address book, settings,

browser bookmarks

• Apps can expose their own contentproviders for other apps to consume

Friday, December 17, 2010

Two choices for publishing

Page 196: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 196/266

data

1. Create your own content provider, or

2. Add data to an existing content provider, if  

it supports the same kind of content and  

you have permission to write to it.

Friday, December 17, 2010

Common interface forcontent providers

Page 197: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 197/266

p

Android system figures out the appropriate

content provider to match the query, and

makes sure it’s up and running.

Query is expressed as a URI.

Friday, December 17, 2010

Content provider URIs

Page 198: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 198/266

Each provider exposes a URI that uniquely identifies

its data set -- or one for each data set it supports.

Each ContentResolver method takes the URI

as its first argument.

Friday, December 17, 2010

How data is exposed

Page 199: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 199/266

Simple table model.

 _ID field uniquely identifies record within the table,

and can be used to match data in other tables.

Friday, December 17, 2010

Query returns a Cursor

Page 200: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 200/266

Actual URL: content://contacts/people/23

Friday, December 17, 2010

Format of a content:// URI

Page 201: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 201/266

A: Standard prefix (always content://)

B: Authority

C: Path used by CP to determine type of databeing requested

D: ID of a specific record (optional)

Friday, December 17, 2010

Other query arguments• Names of columns to return

Page 202: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 202/266

• Names of columns to return

• WHERE clause (filtering rows)

• Selection arguments

• ORDER BY clause (sorting rows)

Friday, December 17, 2010

Reading from the cursor

Page 203: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 203/266

Friday, December 17, 2010

Reading large binary data

Page 204: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 204/266

Data for some columns might be returned as a

content: URI String, rather than an object.

Friday, December 17, 2010

Modifying data - addingrecords

Page 205: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 205/266

Friday, December 17, 2010

Change values for existingrecords

Page 206: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 206/266

Friday, December 17, 2010

Creating your own contentprovider

Page 207: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 207/266

• Set up some way to store the data (e.g.,

SQLite database)

• Extend ContentProvider class to access it

• Declare the ContentProvider class in your

manifest

Friday, December 17, 2010

Extending ContentProvider

Page 208: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 208/266

Create CONTENT_URI

Define column names as public static String values,including “_id”

Implement methods:

Friday, December 17, 2010

Declare the content providerin the manifest

Page 209: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 209/266

Friday, December 17, 2010

Page 210: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 210/266

Sensors

Friday, December 17, 2010

Android Device Sensors

Page 211: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 211/266

• Accelerometer

•Compass

• Proximity

• Ambient Light

• Gyroscope (Nexus S)

Friday, December 17, 2010

Even more Sensors...

Page 212: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 212/266

Friday, December 17, 2010

Enumerating availablesensors

Page 213: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 213/266

A device can have more than one sensor of a given type.

Friday, December 17, 2010

Available sensors

Page 214: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 214/266

HTC Nexus One:

Motorola Droid:

Friday, December 17, 2010

Accelerometer

Page 215: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 215/266

Measures acceleration,not velocity .

Friday, December 17, 2010

Accelerometer applications

Page 216: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 216/266

Friday, December 17, 2010

Useful (and useless)acceleration constants

Page 217: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 217/266

SensorManager.GRAVITY_EARTH

SensorManager.GRAVITY_JUPITER

SensorManager.GRAVITY_DEATH_STAR_I

Friday, December 17, 2010

Listening for changes

Page 218: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 218/266

Friday, December 17, 2010

Isolating or ignoring gravity

Use a low -pass filter if you’re only interested in the

Page 219: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 219/266

orientation of the device.Use a high-pass filter if you’re only interested in

sudden motions.

Friday, December 17, 2010

Magnetic Field sensor

Page 220: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 220/266

• Senses orientation of a magnetic field

• Measures field strength in x, y, z axes,similar to Accelerometer

• Most common application: Electronic

compass

Friday, December 17, 2010

Electronic compass

+y

Page 221: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 221/266

-y

+x-x

N

y

x

α

α = arctan(y/x)

α = 45°

So we mustbe facing

Northwest.

y/x = 1.0

Friday, December 17, 2010

Orientation

Page 222: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 222/266

• Actually a combination of acceleration and

magnetic field sensors

• Takes into account device orientation

• Easy way to access Compass information

• Returns azimuth, pitch, and roll

Friday, December 17, 2010

Gyroscope

Page 223: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 223/266

Measures rate of rotation around each axis.

These values are usuallyintegrated over time to

produce an angle.

Friday, December 17, 2010

Don’t forget to shut off!

Page 224: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 224/266

• Registered sensor listeners will keep

getting updates as long as app is running

• Doesn’t matter if screen is locked, activity

is paused or destroyed

•Un-register to prevent draining the battery

Friday, December 17, 2010

Page 225: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 225/266

Lab: ApiDemos

Friday, December 17, 2010

Page 226: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 226/266

Activities: Managing state

Friday, December 17, 2010

A paused activity could bedestroyed at any time.

Page 227: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 227/266

• If your Activity is sensitive to state, save the

state in the onPause() method, and restoreit in onCreate().

• Or, override onSaveInstanceState().

Friday, December 17, 2010

Using shared preferences

Page 228: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 228/266

Friday, December 17, 2010

ImplementingonSaveInstanceState()

Page 229: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 229/266

• System will call onSaveInstanceState() just

before the activity is destroyed.

• Default implementation callsonSaveInstanceState() on all the subviews.

• When the activity is re-started, onCreate()

will be called with a non-NULL Bundle, and

so will onRestoreInstanceState().

Friday, December 17, 2010

What’s a Bundle?Name-value pairs that can be serialized.

Page 230: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 230/266

Values can be primitives, Strings, arrays,

Parcelables, and other bundles.

Friday, December 17, 2010

Special case: Configurationchange

Page 231: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 231/266

• onRetainNonConfigurationInstance()

• getLastNonConfigurationInstance()

Friday, December 17, 2010

Testing Activity statemanagement

Page 232: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 232/266

Friday, December 17, 2010

Application-level state

Page 233: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 233/266

• Create a subclass of the Application class,and name it in your manifest

• Store application-wide values in your

Application-derived class

• Values are retained as long as app remains

alive, even if Activities are destroyed

Friday, December 17, 2010

Editing shared preferences

Page 234: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 234/266

Friday, December 17, 2010

/res/xml/options.xml

Page 235: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 235/266

Friday, December 17, 2010

Activity that managesreferences

Page 236: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 236/266

Friday, December 17, 2010

Page 237: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 237/266

Search

Friday, December 17, 2010

Search is a core feature

Page 238: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 238/266

• Anything is searchable, even if the data isn’t

on the device

•Seamless and consistent search experience

across the whole system

• Android search framework has two parts:

•User interface for kicking off a search

• Interaction layer that communicates withinstalled apps

Friday, December 17, 2010

Local search

Page 239: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 239/266

Current

activity isn’t

interruptedwhen the

search box

appears.

Friday, December 17, 2010

SearchManager handles it

Page 240: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 240/266

• SearchManager shows the search dialog

when the Search key is pressed

• SearchManager creates an Intent thatpasses the search query to your designated

search-handler Activity

•Your search-handler Activity performs the

search and presents the results

Friday, December 17, 2010

Create a searchableconfiguration

Page 241: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 241/266

res/xml/searchable.xml

The android:hint might be “Search MyApplication”

Friday, December 17, 2010

Create a searchable Activity

M d h ACTION SEARCH i

Page 242: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 242/266

Must respond to the ACTION_SEARCH intent.

Must point to the searchable.xml resource.

Friday, December 17, 2010

Decide which Activities shouldenable the Search button.

Page 243: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 243/266

A searchable context is any Activity for which you have

declared searchable meta-data in the manifest file.

Or, enable the

entire app:

Friday, December 17, 2010

Implementing the search-handler Activity

Page 244: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 244/266

Receive and process the query:

Best way to return the results: an Adapter.

Friday, December 17, 2010

Present the results

Page 245: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 245/266

•Typically, using a ListView; you would

extend your Activity from ListActivity.

• Results can be presented any way you like.

Friday, December 17, 2010

If the search-handler activityis the current activity...

Page 246: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 246/266

Mark the activity android:launchMode="singleTop"

Friday, December 17, 2010

Adding custom suggestions

You can suggest results that match the

l tt t d f

Page 247: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 247/266

letters entered so far.

These can also be shownin the system-wide Quick 

Search Box!

Friday, December 17, 2010

Custom suggestion steps

Page 248: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 248/266

• Implement a basic search-handler Activity

• Create a Content Provider to supply data

• Modify searchable configuration with info

about your content provider

• Declare the Intent to be sent when user

selects a suggestion

Friday, December 17, 2010

After Search box isdisplayed:

Page 249: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 249/266

• Search Manager puts text-so-far into a Query

and sends it to your content provider

• Your CP returns a Cursor with all matching

results

•SM displays the list of suggestions from your

Cursor.

Friday, December 17, 2010

Modify the searchableconfiguration

Page 250: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 250/266

res/xml/searchable.xml

Friday, December 17, 2010

Handling the suggestion query

Page 251: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 251/266

content://your.authority/optional.suggest.path/SUGGEST_URI_PATH_QUERY/sometext

SearchManager calls your query() method with

a URI that looks like this:

String query = uri.getLastPathSegment().toLowerCase();

Get the query text:

Friday, December 17, 2010

Returning the result Cursor

Page 252: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 252/266

Android expects certain specific columns

to be returned in your Cursor object.

See the Android documentation for the

full specification.

Examples: First line of text, second line of text, icon

Friday, December 17, 2010

Declare the Intent action

Determines the Intent when the user

Page 253: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 253/266

Normally, it is ACTION_VIEW.

Determines the Intent when the userchooses a suggestion.

Friday, December 17, 2010

Handling the Intent in yoursearch-handler Activity

Page 254: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 254/266

Friday, December 17, 2010

Expose suggestions to theQuick Search Box

Page 255: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 255/266

AndroidManifest.xml:

res/xml/searchable.xml:

Friday, December 17, 2010

Page 256: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 256/266

Multimedia

Friday, December 17, 2010

MediaPlayer: Multimediaplayback 

Page 257: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 257/266

• Initialize the Media Player, with media to

play

• Prepare the Player for playback 

• Start playback 

• Stop (or pause)

Friday, December 17, 2010

MediaPlayer state machine

Page 258: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 258/266

Friday, December 17, 2010

Simple audio playback 

From Negotiator app:

Page 259: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 259/266

Playing a system sound:

Friday, December 17, 2010

Asynchronous prepare

Page 260: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 260/266

Friday, December 17, 2010

Playback errors

Page 261: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 261/266

• Various reasons why playback can fail:• Unsupported media type or encoding

•Resolution too high

• Streaming I/O errors

• Set up an OnErrorListener handler

• Catch IllegalStateException and

IllegalArgumentException

Friday, December 17, 2010

Video playback 

Page 262: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 262/266

• Video needs a Surface to be displayed upon

• VideoView control has a built-in Surface,and encapsulates MediaPlayer

• Or, create and use a SurfaceView object

Friday, December 17, 2010

VideoView control

Page 263: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 263/266

Friday, December 17, 2010

Page 264: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 264/266

Lab: Audio and Video

Friday, December 17, 2010

Further Reading

Page 265: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 265/266

• Android Developer

Documentation: docs/

index.html

• Android 2 ApplicationDevelopment

•Pro Android 2

Friday, December 17, 2010

Page 266: Android Training Deck

7/12/2019 Android Training Deck

http://slidepdf.com/reader/full/android-training-deck 266/266

Enjoy Android!