SLIDE 1 Programming Android applications: an incomplete introduction
Software Design December 2013
SLIDE 2 Preliminaries : Goals
- Introduce basic programming Android concepts
- Examine code for some simple examples
- Limited to those relevant for the project at hand
- Provide references to best materials for self
study, read them before programming , trial and error takes longer
- Understand provided project implementation
- Homework for a quick start
SLIDE 3 Preliminaries: why Android
- Many students own an Android phone
- Known and free development environment
(Android SDK + Eclipse + ADK plugin)
- Well documented
- Good chance to learn UI design
- T
ake away course project in your pocket, funny to see and show your software running in a phone
- Starting point to learn more on mobile
development
SLIDE 4 Preliminaries: why Android
- Drawbacks: learning curve, lots of details
- Many things left out: fragments, programming
action bars, themes...
- How to learn: try to solve small problems in
separate projects, like
- create an action bar wit actions and overflow
action
- customize a ListView to show name and time
- make a contextual action bar
SLIDE 5 Contents
- 1. References
- 2. Development framework
- 3. Building blocks
- 4. Structure of an Android project
- 5. Activity life cycle
- 6. Views, Layouts
SLIDE 6 Contents
- 7. Menus
- 8. Action bar
- 9. Intents, Broadcast receivers, Adapters
- 10. Dialogs, Preferences
- 11. Services
- 12. TimeT
racker architecture
SLIDE 7
References
Published since 2010 (O'Reilly, Apress, Wrox, Manning) and many more ...
SLIDE 8 References
Professional Android 4 application
- development. Reto Meier. Wiley, 2012.
Complete, comprehensive, basic and advanced
- topics. I used the Android 2 version to learn.
Source code at eu.wiley.com Hello, Android. 3rd Edition. Ed Burnette. The pragmatic programmers, 2010. Simpler, only basic topics. Sudoku application. Source code at http://pragprog.com/book/eband3/hello-android Android UI fundamentals: develop and
- design. Jason Ostrander. Peachpit, 2012.
Focused on UI only. Example application: a time tracker (1 level). Source code at www.peachpit.com/androiduifundamentals
SLIDE 9
References
http://cataleg.uab.cat/search*cat/X?SEARCH=%28android%29&SORT=D
December 2013
SLIDE 10
References
http://developer.android.com/training/index.html
SLIDE 11
References
In Eclipse, you can install many (legacy) application examples : File → New → Other → Android → Sample project ...
SLIDE 12
References
Load examples as Eclipse projects: File → New Android project → create from existing sample → Api demos Run and see source code for the API demos.
Virtual device emulator
SLIDE 13
References
For example, in emulator: Api Demos → Views → Controls → Light theme and in Eclipse:
res/layout/controls_1.xml apis.views/controls1.java
SLIDE 14 Development framework
http://developer.android.com/resources/dashboard/platform-versions.html
SLIDE 15
Development framework
1.6 2.2 4.0
SLIDE 16 Building blocks
Main logical components of Android applications :
- Activity : UI component typically corresponding to
- ne screen. They contain views = UI controls like
buttons, editable text boxes... May react to user input and events (intents) An application typically consists of several screens, each screen is implemented by one activity. Moving to the next screen means starting a new
- activity. An activity may return a result to the
previous activity.
SLIDE 17 Building blocks
- Service : application part that runs in background
without the user’s direct interaction, similar to a Unix daemon. For example, a music player.
- Content provider : generic interface to manage
(access, change) and share (like “contacts”) application data. Can be stored as SQLite databases.
Activity Application Activity Application Activity Content Provider Service Application Data file SQLite XML file Remote Store Content Resolver Content Resolver Content Resolver
SLIDE 18 Building blocks
- Intent : “messages” sent by an activity or service
in order to
launch an activity = show a new screen broadcast (announce) that a certain event has
- ccurred so that it can be handled
Fundamental to decouple cooperating application components.
- Post 3.0 APIs include some more components:
fragments, tasks...
SLIDE 19
Building blocks
Structure of an Android project: create and run a “Hello world” application, File → New → Android application project → ...
Do not close the emulator! It takes a lot to start. Each time you build the project, the new version is uploaded and execution starts automatically.
SLIDE 20
Automatically generated code HelloWordActivity.java
SLIDE 21
“Inflates” the UI from the main.xml file specifying it Autogenerated class R HelloWordActivity.java
SLIDE 22
Place to define UI constant strings, values, arrays of integers and strings, colors, size of things (dimensions)... Can use the Resources assistant to edit. values/strings.xml
SLIDE 23
Message displayed in the screen values/strings.xml
SLIDE 24
xml view AndroidManifest.xml
SLIDE 25
- includes xml nodes for each of the application
components : Activities, Services, Content Providers and Broadcast Receivers
- using intent filters to specify how they interact
with each other:
which activities can launch another activity or
service
which broadcast intents an activity listens to,
in order to handle them with a receiver ...
- offers attributes to specify application metadata
(like its icon or theme) AndroidManifest.xml
SLIDE 26
This activity may be the application entry point. Won't start on devices supporting an older API AndroidManifest.xml
SLIDE 27
The interface design is represented in XML, decoupling design from code (opposite to “programmatic UI”). A call “inflates” the UI. Layout is a special view that contains other views in specific spatial arrangements. LinearLayout arranges its children in a single column or row. TextView is a non-editable text label.
XML view of the UI design
layout/main.xml
SLIDE 28
string id defined in string.xml layout/main.xml
SLIDE 29 <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:id="@+id/textViewTitol" android:text="TubeQuoter V0.10" /> <TableLayout android:id="@+id/tableLayout1" android:layout_marginLeft="20dp" > <TableRow android:id="@+id/tableRow1"> <TextView android:id="@+id/textViewLabelLongitud" android:text="Longitud" /> <EditText android:id="@+id/editT extLongitud" android:inputT ype="number" > <requestFocus /> </EditT ext> <TextView android:id="@+id/textViewLabelUnitatsLongitud" android:text="mm" /> </TableRow> : : </TableLayout> <Button android:id="@+id/butocalcul" android:text="Calcula" /> </LinearLayout>
layout/main.xml
SLIDE 30
Graphical view of the UI design, better to design. Select item and edit properties.
layout/main.xml
SLIDE 31 Activity Life Cycle
- Many Android devices have limited memory,
CPU power, and other resources.
- The OS assures the most important processes
get the resources they need.
- In addition, the OS takes
responsiveness very seriously: if the application does not answer user input (key press...) in < 5 secons, the ANR dialog appears.
SLIDE 32 Activity Life Cycle
- Each application runs in its own
process, which has a main thread, within which activities, services... run
- The OS ranks processes and
kills those with lowest priority, if some application needs unavailable resources.
- If a process is killed “in the middle”, somehow
data can not be lost.
SLIDE 33 Activity Life Cycle
Android in practice. Collins, Galpin, Käpler. Manning, 2012.
SLIDE 34 Activity Life Cycle
States of an activity and methods invoked when changing state
Hello Android. Ed Burnette. The Pragmatic Programmer, 2010
Activity is active = visible in foreground interacting with user Activity is visible in background Not visible. Will remain in memory. Need to save data, such as a database record being edited.
SLIDE 35 States of an activity and methods invoked when changing state. Changing orientation landscape ←→ portrait calls onDestroy() +
- nCreate(). Ctrl-F11
- n virtual device.
SLIDE 36 Homework Recap
- Get some recommended book AND read
developer.android.com/training main topics
- Load API demos in Eclipse : File → New → Other
Android → Android project from existing code + select <SDK folder>/android-18/samples/legacy
- Create a Hello world project
- with string and icon resources
- try different nested layouts
SLIDE 37
Views, Layouts
Control: extension of class View that implements some simple functionality, like a button. ViewGroup : extensions of the View class that can contain multiple child Views (compound controls). Layout managers, such as LinearLayout. Activities represent the screen being displayed to the user. You assign a View or layout to an Activity:
main.xml HelloWordActivity.java
SLIDE 38 Controls: catalog and appearance depends on API level. Look at
- Eclipse Graphical layout editor : shows controls
depending on the API level of your project.
- Run Api Demos → Views
- developer.android.com/guide/components
Views, Layouts
SLIDE 39
Views, Layouts
Common controls : T extView, EditT ext (many types), Button, ListView, ExpandableList, Spinner, Checkbox, ProgressBar, SeekBar, RadioGroup, RatingBar, Time and Date Picker …
SLIDE 40 Views, Layouts
Layouts control the position of child controls on a screen. Common layouts:
- LinearLayout adds each child View in a straight
line, either vertically or horizontally
- RelativeLayout define the positions of child
Views relative to each other or screen boundaries
- TableLayout lay out Views using a grid of rows
and columns Can be nested, creating arbitrarily complex interfaces.
SLIDE 41
Views, Layouts
1 2 3 4 1 2 3 4
LinearLayout
1 2
SLIDE 42
Views, Layouts
RelativeLayout
SLIDE 43 <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <T extView android:id="@+id/textViewTitol" android:text="T ubeQuoter V0.10" /> <TableLayout android:id="@+id/tableLayout1" android:layout_marginLeft="20dp" > <T ableRow android:id="@+id/tableRow1"> <T extView android:id="@+id/textViewLabelLongitud" android:text="Longitud" /> <EditT ext android:id="@+id/editT extLongitud" android:inputT ype="number" > <requestFocus /> </EditT ext> <T extView android:id="@+id/textViewLabelUnitatsLongitud" android:text="mm" /> </T ableRow> : : </TableLayout> <Button android:id="@+id/butocalcul" android:text="Calcula" /> </LinearLayout>
SLIDE 44 T
- DoList example : how to react to user input ?
How to bind data to the UI (lists) ?
Views, Layouts
Write to the edit box and then press D-Pad or Enter to add as a new item to the ToDo list. D-Pad
SLIDE 45
Views, Layouts
SLIDE 46
Views, Layouts
From now on, changes on ArrayList todoItems are shown in the screen when adapter notifies it.
SLIDE 47
Views, Layouts
Java anonymous class Override onKey of class onKeyListener Which listeners has an EditT ext ?
SLIDE 48
Views, Layouts
It is possible to customize the aspect and content of items in a ListView. See Ch. 4 Reto Meier's book and source code at www.wrox.com
SLIDE 49 Contents
- 7. Menus
- 8. Action bar
- 9. Intents, Broadcast receivers, Adapters
- 10. Dialogs, Preferences
- 11. Services
- 12. TimeTracker architecture
SLIDE 50 Menus
Present application functionality using little screen space. Each Activity can specify its own menu. Difference between pre and post 3.0 platform (API level 10):
- pre: physical menu button on the device, three
levels of menus: options, expanded, submenu
- post: superseded by the action bar
SLIDE 51
Menus
phones with physical navigation keys virtual navigation controls
SLIDE 52 Menus
Three types of menus
- 1. Options menu
- at the bottom of screen
- icons and text
- if more than 6 items, a More item is displayed
that opens an Expanded menu
- On Android 3.0 and higher, items from the
- ptions menu are presented by the action bar
SLIDE 53
Menus
action bar expanded menu
SLIDE 54 Menus
- 2. Context menu
- floating menu that appears when the user
performs a long-click on an element
- similar to “right-click” menu
- provides actions that affect the selected
content, normally an item of a ListView
SLIDE 55 Menus
- 2. Context menu
- from Android 3.0 on, better use a contextual
action bar to present actions the user can perform on the currently selected item
context menu contextual action bar: actions depend on selected item(s) pre 3.0 3.0+
SLIDE 56 Menus
- 3. Popup or submenu
- modal menu anchored to a View, appears
below or above it
- good to provide an overflow of actions that
relate to specific content or to provide options for a second part of a command/menu item
action overflow : less often used actions submenu title
SLIDE 57 Menus
- 3. Popup or submenu
- but can't be nested: a submenu item can not
expand another submenu
- On Android 3.0+ : actions should not directly
affect the corresponding content—that's what contextual actions are for
Context menu and submenu for an item
SLIDE 58 Menus
Programming (1) Recommended: define menu items and properties as a menu resource in XML , not in the code
- easier to visualize the menu structure
- allows to create alternative configurations for
different platform versions, screen sizes...
- compact code: menu is inflated by a single
call
- can use Eclipse's resource editor
SLIDE 59
Menus
SLIDE 60
Menus
to reference the menu options in the code : what's been selected? string resource name that will appear in the UI, better use array of strings in xml
SLIDE 61
Menus
Programming (2) Override Activity method to inflate the xml menu
res/menu/game_menu.xml
SLIDE 62
Menus
Programming (3) Program event handling : when the user selects an item from the options menu (also action items in the action bar), the system calls the activity's method
selected item item ids
SLIDE 63
Menus
Spinners offer similar functionality: multiple choice selection from exclusive options on a dropdown menu. Menu items can contain radiobuttons but also checkboxes and form groups
Not a menu control!
SLIDE 64 Action bar
Replaces the options menu in Android 3.0+ with buttons ('action items') One of the most important design elements of an Android app. :
- dedicated piece of screen
- visible throughout the app.
running
- makes our app. consistent with
the core Android apps.
SLIDE 65
Action bar
Examples
SLIDE 66 Action bar
Purposes :
- make important actions prominent and
accessible [3]
- support consistent navigation and view
switching [2] (with spinner or tabs)
- reduce clutter by providing an action overflow
for rarely used actions [4]
action buttons action
spinner app. icon
SLIDE 67 Action bar
Action bars can be split
Display actions and, if necessary, the action
main action bar top bar bottom bar If the user can navigate, contains the up caret, at a minimum T
the views, use tabs or a spinner in the top/main action bar
SLIDE 68 Action bar
spinner action
SLIDE 69 Dialogs
Small windows displayed over the screen.
- modal: block all user input and
must be dismissed before the user can continue.
- partially obscures the Activity that
launched it. Purposes : answer questions Yes/No, Ok/Cancel... make selections read warning or error messages show bar progress
SLIDE 70 Dialog share a common structure:
- Optional title region: Introduces
content
- Content area: text, UI elements,
text fields, checkboxes, etc...
ypically OK/Cancel, indicating the preferred option.
Dialogs
SLIDE 71 Special types of Dialogs:
- Alerts: Inform user from a
situation that requires confirmation.
dialogs with a single selection from the user.
- Toasts: Small pop-up that
feedbacks about
automatically.
Dialogs
SLIDE 72 Dialogs
Programming (1) Dialogs should normally be created(instantiated) within the Activity's onCreateDialog(int). This is called only the first time the dialog is showed. T
- show the dialog, call showDialog(int)
T
- change dialog properties each time the dialog
is opened, define onPrepareDialog(int)
1st call showDialog(id)
- nCreateDialog(id)
- nPrepareDialog(id)
- nPrepareDialog(id)
2nd call showDialog(id)
SLIDE 73
Programming (2) The best way to define onCreateDialog(int) is with a switch statement that checks the id of the dialog being created. The method must return the dialog created.
Dialogs
SLIDE 74 Programming (3) When it's time to show one of the dialogs, call showDialog with the desired ID. T
- close a dialog, you can dismiss it by calling
dismiss() from the Dialog object. If necessary, you can also call dismissDialog(int) from the Activity.
Dialogs
SLIDE 75 Preferences
Android provides classes to manage application preferences and implement the preferences UI.
- ensures consistency, with
specific UI elements (e.g ListPreference)
- all preferences within each
application is maintained in the same manner.
SLIDE 76 Preferences
The SharedPreferences class:
- provides a general framework to save and
retrieve key-value pairs.
- there is a single instance of this class.
- its data will persist across user sessions (even if
the app is killed)
SLIDE 77 Preferences
Steps to implement the Preferences:
- 1. Add string resources needed for preferences.
SLIDE 78 Preferences
- 2. Create the preferences UI layout (using
standard Preference UI elements).
We can reference the string resources
SLIDE 79 Preferences
- 3. Create the Preferences Activity, and inflate the
layout overriding the onCreate method.
- 4. Add static string values to identify each of the
preferences by a unique key.
SLIDE 80 Preferences
- 5. Implement the OK/Cancel listeners and a
method to save preferences.
This method commits changes
- n the sharedPreferences object
SLIDE 81 Preferences
Add pairs “string,value” to the SharedPreferences
Commit changes. If the preferences file MYPREFS does not exist, it will be created
- 5. Implement the OK/Cancel listeners and a
method to save preferences.
SLIDE 82 Preferences
- 6. Apply the preferences when the activity starts.
Preferences file
exist will be created when committing changes Unique preference key (string) Default value if it is not defined
SLIDE 83 Intents
Intents is a fundamental concept in Android development : “the glue that binds applications' components”. Message-passing mechanism to
- explicitly or implicitly start an Activity or a
Service
- broadcast that an event has occurred,
application or system-wide to handle user action or process a piece of data
SLIDE 84
Intents
SLIDE 85 Intents
context activity to start Intents can return a result: startActivityForResult()
SLIDE 86
Intents
Need to declare all activities in AndroidManifest.xml
SLIDE 87 Broadcast Receivers
Intents can also be used to broadcast messages to anonymous components with one same application. The sender can associate data to those intents. A broadcast receiver (maybe within other app. component):
- listens for selected types of broadcast intents
- responds to them = processes associated data
'Anonymous' implies components are loosely coupled, do not need to know each other.
SLIDE 88
Broadcast Receivers
On button click a broadcast intent of type “NEW_LIFE” is sent, along with three data fields. A broadcast receiver object has subscribed to this type of messages in the AndroidManifest.xml. The receiver does not belong to an Activity or Service in this case. Response is printing a message.
NEW_LIFE String name double longitude double latitude
SLIDE 89
Broadcast Receivers
SLIDE 90
Broadcast Receivers
data field names Broadcast intent type
SLIDE 91
Broadcast Receivers
The broadcast receiver will always be active (listening), even when MyActivity has been killed or not started
SLIDE 92
Broadcast Receivers
Register the receiver when MyActivity is visible and unregister when not. T ypically when the receiver updates am UI element.
SLIDE 93
TimeTracker architecture
LlistaActivitatsActivity.java LlistaIntervalsActivity.java ListView controls
SLIDE 94
TimeTracker architecture
Contains the actual activities and intervals tree Analogous to TimerT ask or Timer, which are not usable in Android. See code comments and references there. Harder to destroy by Android OS than activities
SLIDE 95
TimeTracker architecture
Show a part of the tree, the childs of some node . P T P P T P T P I I I
root
different fields
SLIDE 96
TimeTracker architecture
DONAM_FILLS PUJA_NIVELL BAIXA_NIVELL DONAM_FILLS ENGEGA_CRONOMETRE PARA_CRONOMETRE PUJA_NIVELL
SLIDE 97
TimeTracker architecture
TE_FILLS + array of project and task data : dates and duration TE_FILLS + array of interval data : name, dates and duration
SLIDE 98 TimeTracker architecture
Intent data to activities is a serialized array list of these
This avoids serializing the whole or a subtree of activities and intervals, slow if the tree is large! (need to do it every 2 secs.) Creates a random synthetic but data-consistent large tree (durations and dates)