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 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