Intent filter

Download Report

Transcript Intent filter

Mobile Software Development
Framework: Android
2/23/2011
Y. Richard Yang
1
Admin.
 Homework 2 due today
 Please schedule time to meet with the TA to
demo your program
 Midterm: Wednesday after spring break
2
Recap: Mobile Programming Requirements
Handle heterogeneous devices/configurations
 Be extremely efficiency on using resources
(memory, battery, …)
 Easy programming for event-driven programming
…

3
Recap: tinyOS
 Customized OS for each app.
 Reusability achieved through
 Components and interfaces structure
 Execution model: two threads
 One for tasks
 One for event handling
4
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();
}
}
}
5
Recap: J2ME
 Scale down a popular programming environment to
ease learning
 Use virtual machines to mask device heterogeneity
 Use configuration/profile to handle device
heterogeneity to avoid using lowest common
denominator
 MIDLet and Displayable to support user-interface
driven applications


MIDLet manages app life cycle
Displayable has commands and provides command listener
 Introduce persistent record store
6
Recap: Android
 Scale down a popular programming
environment to ease learning
 Use virtual machines to mask device
heterogeneity
 Activity and View
Activity
 A screen
with which
users can
interact
 Activity has
life cycle to
yield resources
8
View
 A view component is a building block for user
interface components.
 Widget Toolbox
 TextView,

EditText, Button, Form, TimePicker…
ListView
 Layout
• Positions of controls
• LinearLayout, Relativelayout
http://developer.android.com/guide/tutorials/views/index.htm
View by XML
 Layout of visual interface
 Java Code
 Initialize
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
}

Access
TextView myTextView =
(TextView)findViewById(R.id.myTextVie
main.xml
<?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>
User Interaction Event
 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: TipCal
12
Application Framework (Android):
Key Concepts
 Activity and view

Visible screen for user interaction
 External resources
13
External Resources
14
Application Framework (Android):
Key Concepts
 Activity and view

Visible screen for user interaction
 External resources
 Service
15
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 Framework (Android):
Key Concepts
 Activity and view

Visible screen for user interaction
 External resources
 Service
 Intercommunications
Communication
among apps:
- Intent
- broadcast
- data provider
App
App
17
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

19
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.
20
Android: Broadcast Receiver
 Sending a broadcast:
 Context.sendBroadcast(Intent intent,
String receiverPermission)
 Context.sendOrderedBroadcast()
 Receiving broadcast:
 Intent registerReceiver
(BroadcastReceiver receiver,
IntentFilter filter)
21
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>
22
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
23
Intent filter
action
category
data
24
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>
25
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);
27
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
28
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();
}
29
Intent and Broadcast: Sender
String action = "edu.yale.cs434.RUN";
Intent cs434BroadcastIntent =
new Intent(action);
cs434BroadcastIntent.putExtra("message",
"Wake up.");
sendBroadcast(cs434BroadcastIntent);
30
Intent and Broadcast: Receiver
<receiver android:name=".CS434BroadcastReceiver"
android:enabled="true">
<intent-filter>
<action android:name="edu.yale.cs434.RUN" />
</intent-filter>
</receiver>
31
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
}
32
 See CS434 broadcast receiver examples
33
Service
 Extends Service, providing

onStartCommand()The system calls this method
when another component, such as an activity,
requests that the service be started, by
callingstartService(). Once this method executes,
the service is started and can run in the
background indefinitely. If you implement this, it
is your responsibility to stop the service when its
work is done, by
calling stopSelf() or stopService(). (If you only
want to provide binding, you don't need to
implement this method.)onBind()The system calls
this method when another component wants to
bind with the service (such as to perform RPC), by
34
Rules
 Notify users
 Background processing
35
Problem: Booking May Take a Long Time
 ANRs (Application
not responding)
happen when
Main thread
(“event”/UI) does
not respond to
input in 5 sec
 A broadcast
receiver does not
finish in 10 sec

 5-10 sec is
absolute upper
bound
36
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
37
Rules
 Notify users
 Background processing
38
Background Processing
 Problem:
39
public class MyActivity extends Activity {
[...]
// Need handler for callbacks to the UI thread
final Handler mHandler = new Handler();
// Create runnable for posting
final Runnable mUpdateResults = new Runnable() {
public void run() {
updateResultsInUi();
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
[...]
}
40
public class MyActivity extends Activity {
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(mUpdateResults);
}
};
t.start();
}
private void updateResultsInUi() {
// Back in the UI thread -- update our UI elements based on the data in mResults
[...]
}
}
41
Tools: AsyncTask
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!
42
Tools: android.app.IntentService
 An abstract Service
serializes the handling of the Intents passed upon
service start
 to use this class, extend it and implement
onHandleIntent(Intent).
 the Service will automatically be stopped when
the last enqueued Intent is handled

 All requests are handled on a single worker
thread -- they may take as long as necessary
(and will not block the application's main
loop), but only one request will be processed
at a time.
43
Example: Calendar's use of IntentService
public class DismissAllAlarmsService extends IntentService {
@Override
public void onHandleIntent(Intent unusedIntent) {
ContentResolver resolver = getContentResolver();
...
resolver.update(uri, values, selection, null);
}
}
in AlertReceiver extends BroadcastReceiver, onReceive():
(main thread)
Intent intent = new Intent(context,
DismissAllAlarmsService.class);
context.startService(intent);
44