You are on page 1of 53

mobile 

dev camp
android development workshop
amsterdam, november 2008

diego torres milano
diego@codtech.com
copyright © 2008  cod technologies ltd  www.codtech.com
“I have always wished that my 
computer would be as easy to 
use as my telephone.
My wish has come true.
I no longer know how to use my 
telephone.”

­­ Bjarne Stroustrup

copyright © 2008  cod technologies ltd  www.codtech.com
agenda
● introduction to android
● android architecture
● building blocks
● your first android application
● testing and performance
● best practices
copyright © 2008  cod technologies ltd  www.codtech.com
introduction to android
after this section you will...

● identify unique features of 
android platform
● compare android against 
other platforms
● understand android building 
blocks

copyright © 2008  cod technologies ltd  www.codtech.com
what is android ?
● android is the first complete, open 
and free mobile platform
● developed by Open Handset 
Alliance
● software stack than includes
– operating system
– middleware
– key applications
– rich set of APIs Portions of this page are reproduced from work created and 
shared by Google and used according to terms described in 
the Creative Commons 2.5 Attribution License.

copyright © 2008  cod technologies ltd  www.codtech.com
is android linux ?
NO, android is not linux !
android is based on a linux kernel  
but it's not GNU/Linux
● no native windowing 
system
● no glibc support
● no GNU/Linux utilities

copyright © 2008  cod technologies ltd  www.codtech.com
so is android java ?
NO, android is not java !
android is not an implementation 
of any of the Java variants
● uses the java language
● implements part of the 
Java5 SE specification
● runs on a dalvik virtual 
machine instead of JVM

copyright © 2008  cod technologies ltd  www.codtech.com
android linux kernel
android is based on a linux 2.6 kernel, providing
rnel, p
● security
● memory management
● process management
● network stack
● driver model
● abstraction layer
kernel source: source.android.com

copyright © 2008  cod technologies ltd  www.codtech.com
linux kernel enhancements
android introduces some linux kernel patches
● alarm
● ashmem
● binder
● power management
● low memory killer (no swap space available)
● logger

copyright © 2008  cod technologies ltd  www.codtech.com
unique platform characteristics
android characteristics not found on other platforms

● open source

● “all applications are equal” model

● dalvik virtual machine

copyright © 2008  cod technologies ltd  www.codtech.com
other characteristics
interesting features as well, but they are more 
common across other mobile platforms
● application framework enabling reuse of components
● integrated browser based on WebKit OSS engine
● 3D graphics based on the OpenGL ES
● SQLite for structured data storage
● media support for common audio, video, and still images
● camera, GPS, compass, and accelerometer

copyright © 2008  cod technologies ltd  www.codtech.com
courtesy of Google
android architecture

copyright © 2008  cod technologies ltd  www.codtech.com
android building blocks
after this section you will...

● recognize the fundamental 
building blocks
● use these building blocks to 
create applications
● understand applications 
lifecycle

copyright © 2008  cod technologies ltd  www.codtech.com
building blocks

copyright © 2008  cod technologies ltd  www.codtech.com
Activities

● Activities are stacked 
like a deck of cards
● only one is visible
● only one is active
● new activities are 
placed on top

copyright © 2008  cod technologies ltd  www.codtech.com
Activities lifecycle

rectangles are callbacks where
we can implement operations
performed on state changes

copyright © 2008  cod technologies ltd  www.codtech.com
Activities states
● active
– at the top of the stack
● paused
– lost focus but still visible
– can be killed by LMK
● stopped
– not at the top of th stack
● dropped
– killed to reclaim its memory

copyright © 2008  cod technologies ltd  www.codtech.com
Views

● Views are basic building blocks

● know how to draw themselves

● respond to events

● organized as trees to build up GUIs

● described in XML in layout resources

copyright © 2008  cod technologies ltd  www.codtech.com
pattern: load layout

android compiles the XML layout code that is 
later loaded in code usually by

public void onCreate(Bundle


savedInstanceState) {
...

setContentView(R.layout.filename);
...
}

copyright © 2008  cod technologies ltd  www.codtech.com
Views and Viewgroups
● Views and 
Viewgroups trees 
build up complex 
GUIs
● android framework is 
responsible for
– measuring
– laying out
– drawing

copyright © 2008  cod technologies ltd  www.codtech.com
pattern: ids

using a unique id in a XML View definition 
permits locating it later in Java code

private View name;

public void onCreate(Bundle


savedInstanceState) {
...
name = (View)
findViewById(R.id.name);
...
}

copyright © 2008  cod technologies ltd  www.codtech.com
Intents
● Intents are used to move from Activity to Activity
● describes what the application wants
● provides late runtime binding

primary attributes
attribute description
action the general action to be performed, such as VIEW,
EDIT, MAIN, etc.
data the data to operate on, such as a person record in
the contacts database, as URI

copyright © 2008  cod technologies ltd  www.codtech.com
intents playground

http://codtech.com/android/IntentPlayground.apk

copyright © 2008  cod technologies ltd  www.codtech.com
Services
● services run in the background
● don't interact with the user
● run on the main thread
of the process
● is kept running as long as
– is started
– has connections

copyright © 2008  cod technologies ltd  www.codtech.com
Notifications

● notify the user about 
events
● sent through 
NotificationManager
● types
– persistent icon
– turning leds
– sound or vibration

copyright © 2008  cod technologies ltd  www.codtech.com
ConentProviders
● ContentProviders are objects that can
– retrieve data
– store data
● data is available to all applications
● only way to share data across packages
● usually the backend is SQLite
● they are loosely linked to clients
● data exposed as a unique URI
copyright © 2008  cod technologies ltd  www.codtech.com
AndroidManifest.xml
● control file that tells 
the system what to do 
and how the top­level 
components are 
related
● it's the “glue” that 
actually specifies 
which Intents your 
Activities receive
● specifies permissions

copyright © 2008  cod technologies ltd  www.codtech.com
your first android
after this section you will...
● create your own android map 
project
● design the UI
● externalize resources
● react to events
● run the application

copyright © 2008  cod technologies ltd  www.codtech.com
android project

copyright © 2008  cod technologies ltd  www.codtech.com
default application
● auto­generated 
application template
● default resources
– icon
– layout
– strings
● default 
AndroidManifest.xml
● default run 
configuration
copyright © 2008  cod technologies ltd  www.codtech.com
designing the UI
this simple UI designs 
contains
● the window title
● a spinner (drop down 
box) containing the 
desired location over 
the map
● a map displaying the 
selected location

copyright © 2008  cod technologies ltd  www.codtech.com
create the layout
● remove old layout
● add a RelativeLayout
● add a View (MapView not 
supported by ADT)

● replace View by 
com.google.android.m
apview
● change id to mapview
● add a Spinner filling 
parent width
copyright © 2008  cod technologies ltd  www.codtech.com
run the application
● com.google.android.
maps it's an optional 
library not included by 
default
● add <uses-library
android:name="com.go
ogle.android.maps" /
> to manifest as 
application node

copyright © 2008  cod technologies ltd  www.codtech.com
Google Maps API key
● checking DDMS logcat we find
java.lang.IllegalArgumentException: You need to
specify an API Key for each MapView.

● to access Google Maps we need a key
● application must be signed with the same key
● key can be obtained from Google
● MapView should include
android:apiKey="0GNIO0J9wdmcNm4gCV6S0nlaFE8bHa9W
XXXXXX"

copyright © 2008  cod technologies ltd  www.codtech.com
MapActivy
● checking DDMS logcat again

java.lang.IllegalArgumentException: MapViews can


only be created inside instances of MapActivity.

● change base class to MapActivity

● fix imports

● add unimplemented methods

copyright © 2008  cod technologies ltd  www.codtech.com
where is the map ?
● still no map displayed
● check DDMS logcat
● lots of IOExceptions !
● some uses permissions 
are missing
– ACCESS_COARSE_LOCATION

– INTERNET

copyright © 2008  cod technologies ltd  www.codtech.com
finally our map

still some problems ...
● spinner is covered
android:layout_alignPa
rentTop="true"

● has no prompt
prompt: @string/prompt

● externalize resource

copyright © 2008  cod technologies ltd  www.codtech.com
pattern: adapters

an Adapter object acts as a bridge between an 
AdapterView and the underlying data for that view

ArrayAdapter<CharSequence> adapter =
ArrayAdapter.createFromResource(
this, R.array.array,
android.R.layout.layout);

view.setAdapter(adapter);

The Adapter is also responsible for making a View for each item in the 
data set.

copyright © 2008  cod technologies ltd  www.codtech.com
pattern: resources
resources are external files (that is, non­code files) 
that are used by your code and compiled into your 
application at build time.

<resources>
<string-array name=”array”>
<item>item</item>
</string-array>
</resources>

res = getResources().getType(id);

copyright © 2008  cod technologies ltd  www.codtech.com
arrays.xml
<?xml version="1.0" encoding="UTF-8"?>

<resources>
<!-- No support for multidimensional
arrays or complex objects yet (1.0r1) -->

<string-array name="location_names">
<item>Mediamatic Duintjer</item>
<item>NH Hotel</item>
<item>Airport</item>
</string-array>

<string-array name="locations">
<item>52.363125,4.892070,18</item>
<item>37.244832,-115.811434,9</item>
<item>-34.560047,-58.44924,16</item>
</string-array>
</resources>

copyright © 2008  cod technologies ltd  www.codtech.com
complete the class
● create the locations array
locations =
getResources().getStringArray(R.array.locations);

● get the views (ids pattern)
spinner = (Spinner) findViewById(R.id.Spinner01);
mapView = (MapView) findViewById(R.id.mapview);

● create the adapter
ArrayAdapter<CharSequence> adapter = ArrayAdapter.
createFromResource(this,
R.array.location_names,
android.R.layout.simple_spinner_item);
spinner.setAdapter(adapter)

copyright © 2008  cod technologies ltd  www.codtech.com
almost there
● map is displayed
● spinner is displayed
● drop down is 
displayed
● but there's no 
selection button ...
adapter.
setDropDownViewResource(
android.R.layout.
simple_spinner_dropdown_item
);

copyright © 2008  cod technologies ltd  www.codtech.com
respond to events
● when an item is 
selected map should 
be centered at that 
location
spinner.
setOnItemSelectedListener(
new
OnItemSelectedListener() {
});

● invoke 
goToSelectedLocation(ar
g2);

copyright © 2008  cod technologies ltd  www.codtech.com
goToSelectedLocation

protected void goToSelectedLocation(int position) {


String[] loc = locations[position].split(",");

double lat = Double.parseDouble(loc[0]);


double lon = Double.parseDouble(loc[1]);
int zoom = Integer.parseInt(loc[2]);

GeoPoint p = new GeoPoint((int)(lat * 1E6),


(int)(lon * 1E6));

Log.d(TAG, "Should go to " + p);

mapController.animateTo(p);
mapController.setZoom(zoom);
}

copyright © 2008  cod technologies ltd  www.codtech.com
more events
● turn map clickable
android:clickable="true”

● override onKeyDown
switch (keyCode) {
case KeyEvent.KEYCODE_I:
mapController.zoomIn();
break;
case KeyEvent.KEYCODE_O:
mapController.zoomOut();
break;
case KeyEvent.KEYCODE_S:
mapView.setSatellite(
!mapView.isSatellite());
break;
}

copyright © 2008  cod technologies ltd  www.codtech.com
we did it !
● Some things to try
– select a location

– pan

– zoom in

– zoom out

– toggle satellite

copyright © 2008  cod technologies ltd  www.codtech.com
“Remember that there is no 
code faster than no code”
­­ Taligent's Guide to Designing Programs

copyright © 2008  cod technologies ltd  www.codtech.com
testing and performance
after this section you will...

● understand the best practices 
to develop for android
●  identify the alternatives to test 
units, services and applications
● performance

copyright © 2008  cod technologies ltd  www.codtech.com
best practices
● consider performance, android is not a desktop
● avoid creating objects
● use native methods
● prefer virtual over interface
● prefer static over virtual
● avoid internal getter/setters
● declares constants final
● avoid enums

copyright © 2008  cod technologies ltd  www.codtech.com
testing
● android sdk 1.0 introduces
– ActivityUnitTestCase to run isolated unit tests
– ServiceTestCase to test services
– ActivityInstrumentationTestCase to run functional 
tests of activities
● ApiDemos includes some test samples
● monkey, generates pseudo­random of user 
events

copyright © 2008  cod technologies ltd  www.codtech.com
1000000
1500000
2000000
2500000
3000000

500000

0
Add a local variable

Add a member variable

Call String.length()

Call empty static native method

Call empty static method


performance

Call empty virtual method

Call empty interface method

Call Iterator:next() on a HashMap

Call put() on a HashMap

Inflate 1 View from XML

Inflate 1 LinearLayout with 1 TextView

copyright © 2008  cod technologies ltd  www.codtech.com
Inflate 1 LinearLayout with 6 View

Inflate 1 LinearLayout with 6 TextView

Launch an empty activity


Time
“If things seem under control, 
you're not going fast enough.”
­­ Mario Andretti

copyright © 2008  cod technologies ltd  www.codtech.com
thank you
android development workshop
diego torres milano
diego@codtech.com

copyright © 2008  cod technologies ltd  www.codtech.com

You might also like