1 / 18

CE881: Mobile and Social Application Programming Simon M. Lucas

CE881: Mobile and Social Application Programming Simon M. Lucas. Quiz, Walkthrough, Exercise, Lifecycles, Intents. Activity State Transitions and Methods. http :// developer.android.com/training/basics/activity-lifecycle/starting.html. Tips for State Management.

eve
Download Presentation

CE881: Mobile and Social Application Programming Simon M. Lucas

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. CE881: Mobile and Social Application ProgrammingSimon M. Lucas Quiz, Walkthrough, Exercise, Lifecycles, Intents

  2. Activity State Transitions and Methods http://developer.android.com/training/basics/activity-lifecycle/starting.html

  3. Tips for State Management • Save any important information frequently or immediately • Mobile device: the battery could die any time! • Override onPause or onStop to save useful non-critical state (onDestroy is a bit too last-minute for most things) • When overriding onCreate, check to see whether savedInstanceState is non-null

  4. destroy()http://developer.android.com/training/basics/activity-lifecycle/starting.htmldestroy()http://developer.android.com/training/basics/activity-lifecycle/starting.html • “While the activity's first lifecycle callback is onCreate(), its very last callback is onDestroy(). The system calls this method on your activity as the final signal that your activity instance is being completely removed from the system memory. • Most apps don't need to implement this method because local class references are destroyed with the activity and your activity should perform most cleanup during onPause() and onStop(). However, if your activity includes background threads that you created during onCreate() or other long-running resources that could potentially leak memory if not properly closed, you should kill them during onDestroy().”

  5. Screen Orientation • Each time the screen is rotated, the current activity is destroyed, and then re-created • Predefined onCreate() method retrieves state of any View components (i.e. components that sub-class View; this eases the job of the programmer • This follows the call graph in fig 1. • Rationale: • Typically a new layout may be needed, involving new resource allocation • Cleanest solution: always destroy and re-create • Note: apps can specify to always operate in a particular orientation

  6. Managing State Between Orientation Changes • Save state information to the Bundle by overriding onStop() • Re-create state by extracting information from bundle in onCreate() • Discussion question: • In my Lissajous App I didn’t do this, yet state is preserved betweem orientation changes. Why?

  7. Specifying Orientation etc • Following example specifies some other details in a fairly obvious way (easiest way to find this was via a Google search) requestWindowFeature(Window.FEATURE_NO_TITLE); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);

  8. Starting a new Activity • Define a class that sub-classes Activity • Add some GUI control to invoke it from the parent activity • Listen for the relevant event, then launch a new Intent • This will indirectly call the new Activity’s method: • onCreate(Bundle savedInstance) • The new activity will start and enter then Resumed state via the call graph shown previously

  9. The following example adds an Activity to provide information about an App • A menu item called “About” is added to the options menu • We listen for onOptionItemSelected events within the main activity • Create an Intent, then call startActivitywith the Intent as an argument • When the user has finished reading the HTML page, the back button can be used to return to the main app • This behaviour is automatic use of the “back stack”: no need to program it

  10. Intents • “An intent is an abstract description of an operation to be performed.” (developer.android.com) • A bit like a method call • Two flavours: explicit and implicit • An explicit Intent specifies exactly which Activity should be stated • An implicit Intent is more declarative: it what the Activity should do • The system will then search for Activities that match by checking the Intent filters • Example: opening a Web Page (more on this later)

  11. Adding the menu item to our main activity, listening for it and launching Intent public booleanonCreateOptionsMenu(Menu menu) { menu.add("About"); return true; } public booleanonOptionsItemSelected(MenuItem item) { if (item.getTitle().equals("About")) { Intent intent = new Intent(this, AboutActivity.class); startActivity(intent); return true; } return super.onOptionsItemSelected(item); } …

  12. Discussion Point • Anyone notice something non-ideal about this line of code? menu.add("About"); • What’s wrong, and how would you fix it?

  13. AboutActivity • Simple example uses a hard-coded HTML file name; import statements are omitted • Uses a WebView to display an HTML page specied in loadUrl method • Note “android_asset” in the pathname (not “assets”) public class AboutActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); WebViewwb = new WebView(this); wb.loadUrl( "file:///android_asset/html/Lissajous.html"); setContentView(wb); } }

  14. Updating the AndroidManifest.xmljust shows application element, new addition in bold • Note that no intent filter is needed for AboutActivity, since we only need ever call this from the parent application <application android:label="@string/app_name"> <activity android:name="MyActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> <activity android:name="AboutActivity" /> </application>

  15. Sample HTML Filesaved in assets/html/Lissajous.html <!DOCTYPE html> <html> <head> <title>Lissajous Curves</title></head> <body> <h2> LissajousCurves </h2> <p> Lissajous curves are produces by using sine functions to define parametric curves, such as the one below: </p> <p> <img alt="Sample Lissajous Image" height="371" src="Sample.PNG" width="336"></p> </p> <!-- rest of file omitted --> </body> </html>

  16. Implicit Intents • Instead of specifying exactly which Activity class should handle the intent, can instead specify an action e.g. via a URL • Examples: • Web browser (opened at URL) startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.google.co.uk/search?q=lissajous+curve")));

  17. Example: Open a Google Map • This example is almost the same as the previous one – the several step approach is optional • As before, navigating back will return to the main app Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse("geo:" + 42.516845 + "," + -70.898503)); startActivity(intent);

  18. Summary • These notes demonstrated how to start new activities using explicit and implicit intents • The LissajousOne app in Lab 2 uses both types of intent (see options menu of the App) • Also be aware of the App lifecycle, and which state transition methods to override in order to save and re-create state • Note: some of this happens automatically for objects of classes that inherit from View • Work through the Activity Lifecycle section of lab 2

More Related