Survey							
                            
		                
		                * Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
Mobile Software Development
Framework: Android Activity,
View/ViewGroup, External
Resources, Handler/ASyncTask
10/9/2012
Y. Richard Yang
1
Admin.
 Homework 2 questions
2
Recap: TinyOS
 Hardware components motivated design
 Each component/module
• specifies
– the interfaces it provides
– the interfaces/modules it uses
• implements the functions in
– the declared provided interfaces
– event handlers in the declared used interfaces
 Configuration
specifies the linkage among
components/modules
 Execution model
 Event driven (triggered) handlers, who may post
tasks to a FIFO task queue
3
Recap: J2ME
 Java adaptation for mobile devices
 A major software concept is versioning
 Configurations
 Profiles
 For mobile phone devices, the key profile is
MIDP
4
Recap: MIDP Key Concepts
Lifecycle
callbacks
- startApp
- pauseApp
- destroyApp
d=Display.getDisplay(this)
d.setCurrent(disp)
MIDP
A set of
commands
Current
Displayable
Command
listener
5
HelloWorldMIDlet.java
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class HelloWorldMIDlet extends MIDlet
implements CommandListener {
private Command exitCommand;
private Display display;
private TextBox t;
public HelloWorldMIDlet() {
display = Display.getDisplay(this);
exitCommand = new Command("Exit", Command.EXIT, 2);
t = new TextBox(“CS434", "Hello World!", 256, 0);
t.addCommand(exitCommand);
t.setCommandListener(this);
}
public void startApp() { display.setCurrent(t); }
public void pauseApp() { }
public void destroyApp(boolean unconditional) { }
public void commandAction(Command c, Displayable s) {
if (c == exitCommand) {
destroyApp(false);
notifyDestroyed();
}
}
}
6
Recap: J2ME
 Key software concept
 Screen
real-estate is limited => Focus on one
thing at a time
7
Recap: J2ME
 Key software concept
 Screen
real-estate is limited => Focus on one
thing at a time
8
Mobile GUI Workflow
App lifecycle
callbacks/custom
-start
-pause
-…
App
Mobile GUI Workflow: Do One Thing
App lifecycle
callbacks/custom
-start
-pause
-…
Display
Composite
App
Display
Composite
Displa
y
Displa
y
Displa
y
Display
Composite
Displa
y
Displa
y
Mobile GUI Workflow: Display Content Based
on Underlining Data
App lifecycle
callbacks/custom
-start
-pause
-…
Display
Composite
App
Display
Composite
Displa
y
Displa
y
Displa
y
Display
Composite
Displa
y
Data/
Model
Displa
y
Data/
Model
Mobile GUI Workflow: Handle Events
App lifecycle
callbacks/custom
-start
-pause
-…
Display
Composite
App
Display
Composite
Displa
y
Displa
y
Display
Composite
Displa
y
Event
Handle
r
Event
Handle
r
Displa
y
Data/
Model
Displa
y
Data/
Model
Mobile GUI Workflow: Switch to Another GUI
App lifecycle
callbacks/custom
-start
-pause
-…
Display
Composite
App
Display
Composite
Displa
y
Display
Composite
Display
Display
Displa
y
Display
Composite
Display
Display
Composite
Displa
y
Event
Handle
r
Event
Handle
r
Displa
y
Data/
Model
Displa
y
Data/
Model
Discussion
 Key design points for mobile
GUI app
 App
life cycle scheduling and customization
 Support to construct display
 Event scheduling
• How to link event, display, handler, data
14
Framework reacts to
app events and
invokes app lifecycle
event handlers
Typical Design: App
App lifecycle
callbacks/custom
-start
-pause
-…
Display
Composite
App
Display
Composite
Displa
y
Displa
y
Display
Composite
Displa
y
Event
Handle
r
Event
Handle
r
Displa
y
Data/
Model
Displa
y
Data/
Model
How to Provide App LifeCycle Handlers?
 App class implements it
 Inheritance
 App class does not implement it
 Delegate
 Command
listener
16
System captures UI events;
and puts them in a msg
queue of the app. A UI
thread processes the queue
Typical Design: UI
App lifecycle
callbacks/custom
-start
-pause
-…
Display
Composite
App
Display
Composite
Displa
y
Displa
y
Display
Composite
Displa
y
Event
Handle
r
Event
Handle
r
Displa
y
Data/
Model
Displa
y
Data/
Model
Example: IOS
10/
How to Provide Display Component Event
Handlers?
 Display Component class implements it
 Inheritance
 Typically
a bad idea
 Display Component class does not implement it
 Makes
Display reusable
• Delegate
• Command listener
19
Event Handler/Controller Design Issues
 To increase reusability, it is ideal to separate
layout from presentation
20
Outline
 Admin and recap
 Mobile/wireless development framework
 GNURadio
 TinyOS
 J2ME
 IOS
 Android
http://developer.android.com/index.html
21
Android
 A mobile OS, application
framework, and a set of applications
OS
• Customized Linux kernel 2.6 and
3.x (Android 4.0 onwards)
– E.g., default no X Windows,
not full set of GNU libs
Application development framework
• Based on Java (J2SE not J2ME)
• Dalvik Virtual Machine
22
Android Architecture
23
Seeing Android OS
 See
http://developer.android.com/tools/workflo
w/index.html
 Android SDK Manager (android) to start a
simulator
 Android debug bridge (adb) can connect to
an Android device and start a shell on the
device
Allows external XML
resource files to
specify views
Mapping to Android
App lifecycle
callbacks/custom
-start
-pause
-…
Display
Composite
App
Display
Composite
Displa
y
-How to specify the
customized callbacks:
extend Activity class
Displa
y
Display
Composite
Displa
y
-How to link the callbacks defined
in view to listener/controller:
View.set…Listener()
Event
Handle
r
Event
Handle
r
Displa
y
Data/
Model
Displa
y
Data/
Model
Application Framework (Android):
Key Concepts
 Activity
 View/ViewGroup (Layout)
 External resources
26
Activity
 A single, focused thing that the user can do.
 Creating a window to place UI views
 Full-screen windows, floating windows, embedded
inside of another activity
 Typically organized as a Stack
 Top Activity is visible
 Other activities are stopped
 Back button to traverse the Activity Stack
 Long Home shows the content of the Stack
Activity: Manifest File
 To facility launching and managing Activities,
each activity is announced in a manifest file
Instead of a hardcode
string in code, defines
in res/strings
Manifest the activity
Android Project Resources
29
Activity: Example
// MainActivity.java
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
// savedInstanceState holds any data that may have been saved
// for the activity before it got killed by the system (e.g.
// to save memory) the last time
super.onCreate(savedInstanceState);
setContentView(… ); // set a View
}
View
 A view component is a building block for user
interface components.
 Two types of views
TextView, EditText, Button, Form,
TimePicker… ListView
 Composite (ViewGroup): LinearLayout,
 Leaf:
Relativelayout, …
http://developer.android.com/guide/tutorials/views/index.htm
Programmatic Usage of Views
// MainActivity.java
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
// savedInstanceState holds any data that may have been saved
// for the activity before it got killed by the system (e.g.
// to save memory) the last time
super.onCreate(savedInstanceState);
TextView tv new TextView(this);
tv.setText("Hello!“);
setContentView(tv);
}
Define View by XML
Access View Defined by XML
main.xml
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
}
…
TextView myTextView =
(TextView)findViewById(R.id.myTextView);
<?xml version=”1.0” encoding=”utf-8”?>
<LinearLayout
xmlns:android=”http://schemas.android.com
/apk/res/android”
android:orientation=”vertical”
android:layout_width=”fill_parent”
android:layout_height=”fill_parent”>
<TextView
android:id=”@+id/myTextView”
android:layout_width=”fill_parent”
android:layout_height=”wrap_content”
android:text=”Hello World, HelloWorld”
/>
</LinearLayout>
External Resources
 Compiled to numbers and included in R.java file
35
Hello Example
 See HelloStart
36
Android Activity Life Cycle
37
Android Activity
Life Cycle
38
Lifecycle Example
 See ActivityifeCycle
39
Linking Views and Handlers/Controllers
 onKeyDown. onKeyUp
 onTrackBallEvent
 onTouchEvent
registerButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View arg0) {….}}
myEditText.setOnKeyListener(new OnKeyListener() {
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_DOWN)
if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
…
return true;
}
return false;
}});
}
Example: TipCalc
41
Event Handler and ANR
 Event handler
executed by
the main/UI
thread
UI
events
system
events
 ANRs (Application
not responding)
happen when
Main thread
(“event”/UI) does
not respond to
input in 5 sec
42
Event Handler and ANR
43
ANR
 Numbers (Nexus One)
 ~5-25 ms – uncached flash reading a byte
 ~5-200+(!) ms – uncached flash writing tiny amount
 100-200 ms – human perception of slow action
 108/350/500/800 ms – ping over 3G. varies!
 ~1-6+ seconds – TCP setup + HTTP fetch of 6k over 3G
 Rules
 Notify users
 Use background processing
44
Example Background Processing
 LaunchInThread
45
Background Processing using a Thread
 Problem:
 Background
thread and UI thread are running
concurrently and may have race conditions if they
modify simultaneously
 Solution: Android Handler
 Use Handler to send and process Message and
Runnable objects associated with a
thread's MessageQueue.
46
Android Handler
 Each Handler instance is associated with a
single thread and that thread's message
queue.
 A handler is bound to the thread / message
queue of the thread that is creating it
 from
that point on, it will deliver messages and
runnables to that message queue and execute
them as they come out of the message queue.
47
Android Handler
48
Using Handler
 There are two main uses for a Handler:
 to
schedule messages and runnables to be
executed as some point in the future; and
 to
enqueue an action to be performed on a
different thread than your own.
49
Handler
public class MyActivity extends Activity {
[...]
// Need handler for callbacks to the UI thread
final Handler mHandler = new Handler();
// Create runnable task to give to UI thread
final Runnable mUpdateResultsTask = new Runnable() {
public void run() {
updateResultsInUi();
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
[...]
}
50
Handler
protected void startLongRunningOperation() {
// Fire off a thread to do some work that we shouldn't do directly in the UI thread
Thread t = new Thread() {
public void run() {
mResults = doSomethingExpensive();
mHandler.post(mUpdateResultsTask);
}
};
t.start();
}
private void updateResultsInUi() {
// Back in the UI thread -- update our UI elements based on the data in mResults
[...]
}
}
51
Examples
 See BackgroundTimer
 See LoadingScreen
52
Tools: AsyncTask
See GoogleSearch
private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
protected Long doInBackground(URL... urls) { // on some background thread
int count = urls.length; long totalSize = 0;
for (int i = 0; i < count; i++) {
totalSize += Downloader.downloadFile(urls[i]);
publishProgress((int) ((i / (float) count) * 100));
}
return totalSize;
}
protected void onProgressUpdate(Integer... progress) { // on UI thread!
setProgressPercent(progress[0]);
}
protected void onPostExecute(Long result) { // on UI thread!
showDialog("Downloaded " + result + " bytes");
}
}
new DownloadFilesTask().execute(url1, url2, url3); // call from UI thread!
53
54
Service: Working in Background
 A basic function of Android Service:
A facility for an application to tell the system about something it
wants to be doing in the background (even when the user is not
directly interacting with the application).
The system to schedule work for the service, to be run until the
service or someone else explicitly stop it.
NO GUI, higher priority than inactive Activities
 Note
A Service is not a separate process. The Service object itself
does not imply it is running in its own process; unless otherwise
specified, it runs in the same process as the application it is part
of.
A Service is not a thread. It is not a means itself to do work off
of the main thread (to avoid Application Not Responding errors).
Application and Component Glues
 Intent
 An
intent is an abstract description of an
operation to be performed.
 To invoke operations from your own or others
 Can pass data back and forth between app.
 Intent Filter
 Register
Activities, Services, and Broadcast
Receivers as being capable of performing an
action on a particular kind of data.
Intent Description
 <Component
name>
 Action
 Data
 Category,
e.g., LAUNCHER
57
Intent Usage
 Pass to Context.startActivity() or
Activity.startActivityForResult() to launch an activity or get an
existing activity to do something new.
 Pass to Context.startService() to initiate a service or deliver
new instructions to an ongoing service.
 Pass to Context.bindService() to establish a connection
between the calling component and a target service. It can
optionally initiate the service if it's not already running.
 Pass to any of the broadcast methods (such as
Context.sendBroadcast(), Context.sendOrderedBroadcast(), or
Context.sendStickyBroadcast()) are delivered to all interested
broadcast receivers. Many kinds of broadcasts originate in
system code.
58
Android: Broadcast Receiver
 Sending a broadcast:
 Context.sendBroadcast(Intent intent,
String receiverPermission)
 Context.sendOrderedBroadcast()
 Receiving broadcast:
 Intent registerReceiver
(BroadcastReceiver receiver,
IntentFilter filter)
59
Intent Resolution: Explicit
 Explicit intents: component identified
Intent myIntent = new Intent(IntentController.this,
TipCal.class);
startActivity(myIntent);
 Make sure AndroidManifest.xml announces
activities to be started
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".IntentController"
android:label="Intent1">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".TipCal"></activity>
</application>
60
Intent Resolution: Implicit
 Implicit intents
 System
matches an intent object to the intent
filters of others
http://developer.android.com/guide/topics/intents/intents-filters.html
61
Intent filter
action
category
data
62
Intent Example II: Implicit
String action = "android.intent.action.VIEW";
Uri data = Uri.parse("http://www.google.com");
Intent myIntent = new Intent(action, data);
startActivity(myIntent);
 AndroidManifest.xml file for com.android.browser
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<scheme android:name="http" />
<scheme android:name="https" />
<scheme android:name="file" />
</intent-filter>
63
Intent Example II: Implicit
String action = "android.intent.action.DIAL";
String phno = "tel:4326400";
Uri data = Uri.parse(phno);
Intent dialIntent = new Intent(action, data);
startActivity(dialIntent);
A Design Template: Invoker
String action = “com.hotelapp.ACTION_BOOK";
String hotel = “hotel://name/“ + selectedHotel;
Uri data = Uri.parse(hotel);
Intent bookingIntent = new Intent(action, data);
startActivityForResults(bookingIntent, requestCode);
65
A Design Template: Provider
<activity android:name=".Booking" android:label=“Booking">
<intent-filter>
<action android:name=“com.hotelapp.ACTION_BOOK" />
<data android:scheme=“hotel" android:host=“name”/>
</intent-filter>
</activity>
 For more complex data passing, please read
the tutorial
66
A Design Template: Provider
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Intent intent = getIntent(); // why am I called
String action = intent.getAction();
Uri data = intent.getdata();
String hotelName = data.getPath();
// do the booking
setResult(RESULT_OK);
finish();
}
67
Intent and Broadcast: Sender
String action = "edu.yale.cs434.RUN";
Intent cs434BroadcastIntent =
new Intent(action);
cs434BroadcastIntent.putExtra("message",
"Wake up.");
sendBroadcast(cs434BroadcastIntent);
Example: IntentLaunch
68
Intent and Broadcast: Receiver
<receiver android:name=".CS434BroadcastReceiver"
android:enabled="true">
<intent-filter>
<action android:name="edu.yale.cs434.RUN" />
</intent-filter>
</receiver>
69
Intent, Broadcast, Receiver, Notification
public class CS434BroadcastReceiver extends BroadcastReceiver {
public static final String CUSTOM_INTENT = "edu.yale.cs434.RUN";
// Display an alert that we've received a message.
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(CUSTOM_INTENT)) {
String message = (String)intent.getExtras().get("message");
CharSequence text = "Got intent " + CUSTOM_INTENT + " with " + message;
int duration = Toast.LENGTH_SHORT;
Toast mToast = Toast.makeText(context, text, duration);
mToast.show();
} // end of if
} // end of onReceive
}
70
Android: Content Provider
 Each provider can expose its data as a simple
table on a database model
 Each content provider exposes a public URI
that uniquely identifies its data set:
android.provider.Contacts.Phones.CONTENT_URI
android.provider.Contacts.Photos.CONTENT_URI
android.provider.CallLog.Calls.CONTENT_URI
android.provider.Calendar.CONTENT_URI
71
Intent and Content Provider
private void pickContact() {
// Create an intent to "pick" a contact, as defined by the content provider URI
Intent intent = new Intent(Intent.ACTION_PICK, Contacts.CONTENT_URI);
startActivityForResult(intent, PICK_CONTACT_REQUEST);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// If the request went well (OK) and the request was PICK_CONTACT_REQUEST
if (resultCode == Activity.RESULT_OK
&& requestCode == PICK_CONTACT_REQUEST) {
// Perform a query to the contact's content provider for the contact's name
Cursor cursor = getContentResolver().query(data.getData(),
new String[] {Contacts.DISPLAY_NAME}, null, null, null);
if (cursor.moveToFirst()) { // True if the cursor is not empty
int columnIndex = cursor.getColumnIndex(Contacts.DISPLAY_NAME);
String name = cursor.getString(columnIndex);
// Do something with the selected contact's name...
}
}
}
72
Windows .NET Compact Framework
 Similar to J2ME
 Scales down a popular programming environment to ease learning
the .NET CF is a subset of the full .NET framework with some additions
designed for resource constrained devices
1,400 classes for .NET CF vs. 8,000 for full
27 UI controls for .NET CF vs. 52 for full
1.5 MB for .NET CF vs. 30 MB for full
 Uses versioning to avoid using lowest common denominator
pocket PC
pocket PC phone version
smart phone version
 Uses virtual machines to mask device heterogeneity
programming languages compile to MSIL
• MSIL is JIT compiled on the device
• MSIL code is smaller than native executables
• MSIL allows your code to be processor independent
73
Android
 Linux kernel as foundation
 Java based framework (J2SE not J2ME)
 Dalvik Virtual machine
 Nice features
 Touch
screen, accelerometer, compass,
microphone, camera, GPS,
 GSM, EDGE, and 3G networks, WiFi, Bluetooth,
Near field communications
 Media, SQLite, WebKit, SSL
 Location-based service, map (Google API)
74
Does Background Solve All
Issues?
75
Example: Accessing Data in Cloud
 A typical setting is that a device accesses
data in the cloud, e.g.,
 background
sync
 Challenge: How do you keep data on a device
fresh?
76
Polling
 Simple to implement
 Device periodically asks server for new data
 Appropriate for content that changes
constantly
 Stock
Quotes, News Headlines
77
Impact of Polling on Battery
 Baseline: ~5-8 mA
 Network: ~180-200 mA
 Tx more expensive than Rx
 Assume radio stays on for 10 sec.
 Energy
per poll: ~0.50 mAh
 5 min frequency: ~144 mAh / day
 Droid 2 total battery: 1400 mAh
Source: Android development team at Google
78
Solution: Push
 Google Contacts, Calendar, Gmail, etc., use
push sync
 A single persistent connection from device to
Google
 Android Cloud to Device Messaging (C2DM)
to make it a public service
79
C2DM Overview
 Uses existing connection for Google services
 Your servers send lightweight “data”
messages to apps
 Tell app new data available
 Intent broadcast wakes up app
 App supplies UI, e.g., Notification, if/as
necessary
80
C2DM Flow
 Enabling cloud to device messaging
 App
(on device) registers with Google, gets
registration ID
 App sends registration ID to its App Server
 Per message
 App Server sends (authenticated) message to
Google
 Google sends message to device
 Disabling cloud to device messaging
 App can unregister ID, e.g., when user no longer
wants push
81
C2DM
82
Android Code: Registration to C2DM
// Use the Intent API to get a registration ID
// Registration ID is compartmentalized per app/device
Intent regIntent = new
Intent(“com.google.android.c2dm.intent.REGISTER”);
// Identify your app
regIntent.putExtra(“app”,
PendingIntent.getBroadcast(this, 0, new Intent(), 0);
// Identify role account server will use to send
regIntent.putExtra(“sender”, emailOfSender);
// Start the registration process
startService(regIntent);
83
Receiving Registration ID
// Registration ID received via an Intent
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (“…REGISTRATION”.equals(action)) {
handleRegistration(context, intent);
} }
private void handleRegistration(Context context,
Intent intent){
String id = intent.getExtra(“registration_id”);
if ((intent.getExtra(“error”) != null) {
// Registration failed. Try again later, with backoff.
} else if (id != null) {
// Send the registration ID to the app’s server.
// Be sure to do this in a separate thread.
} }
84
Receiving Registration ID
 App receives the ID as an Intent
 com.google.android.c2dm.intent.REGISTRATION
 App should send this ID to its server
 Service may issue new registration ID at any
time
 App will receive REGISTRATION Intent
broadcast
 App must update server with new ID
85
Application Framework (Android):
Key Concepts
 Activity and view
 Visible
screen for user interaction
 External resources
86
External Resources
87
Application Framework (Android):
Key Concepts
 Activity and view
 Visible
screen for user interaction
 External resources
 Service
88
Application Framework (Android):
Key Concepts
 Activity
 View/ViewGroup (Layout)
 External resources
 Service
 Intercommunications
Communication
among apps:
- Intent
- broadcast
- data provider
App
App
89
Mobile GUI Workflow: Switch to Another
App lifecycle
callbacks/custom
-start
-pause
-…
Display
Composite
App
Display
Composite
Displa
y
Display
Composite
Display
Display
Display
Composite
Displa
y
Displa
y
Display
Composite
Displa
y
Displa
y
Display
Data/
Model
Data/
Model
Extend MIDP GUI Key Concepts
to General Setting
Display
Composite
Display
Display
Composite
Display
Display
Composite
Display
Display
Display
91
Extend MIDP GUI Key Concepts
to General Setting
App lifecycle
callbacks/custom
-start
-pause
-…
View
Group
App
View
Group
View
Event
listener/co
ntroller
Event
listener/co
ntroller
View
View
Group
View
View
View
92
System Support
App lifecycle
callbacks/custom
-start
-pause
-…
System schedules apps
and notifies app on life
cycle events
View
Group
App
View
Group
View
Event
listener/co
ntroller
Event
listener/co
ntroller
View
View
Group
View
View
View
93
System Support
App lifecycle
callbacks/custom
-start
-pause
-…
System schedules apps
and invokes app life
cycle event handlers
View
Group
App
View
Group
View
Event
listener/co
ntroller
System propagates UI
events, and invokes UI view
event handlers
Event
listener/co
ntroller
View
View
Group
View
View
View
94
GUI Design/Implementation Points
App lifecycle
callbacks/custom
-start
-pause
-…
View
Group
App
-How to specify the
customized life cycle
callbacks?
Event
listener/co
ntroller
View
Group
View
Event
listener/co
ntroller
View
View
Group
View
View
View
95
GUI Design/Implementation Points
App lifecycle
callbacks/custom
-start
-pause
-…
View
Group
App
-How to specify the
customized life cycle
callbacks?
Event
listener/co
ntroller
-How to define the
view structure?
View
Group
View
Event
listener/co
ntroller
View
View
Group
View
View
View
96
GUI Design/Implementation Points
App lifecycle
callbacks/custom
-start
-pause
-…
View
Group
App
-How to specify the
customized life cycle
callbacks?
Event
listener/co
ntroller
-How to specify the
callbacks for a view?
-How to define the
view structure?
View
Group
View
Event
listener/co
ntroller
View
View
Group
View
View
View
97
GUI Design/Implementation Points
App lifecycle
callbacks/custom
-start
-pause
-…
Event
listener/co
ntroller
-How to link the callbacks
defined in a view to
listener/controller?
Data/M
odel
View
Group
App
-How to specify appspecific life-cycle
handlers?
-How to define the
view structure?
View
Group
View
Event
listener/co
ntroller
View
View
Group
View
View
View
98