Minds-on: Android Session 2 Paulo Baltarejo Sousa Instituto Superior de Engenharia do Porto 2016
Outline Activities UI Events Intents Practice Assignment 1 / 33
2 / 33 Activities
Activity An activity provides a user interface (UI) for a single screen in an app Each activity is given a window in which is drawn its UI. The window typically fills the screen, but may be smaller than the screen and float on top of other windows. To create an activity, you must create a subclass of Activity (or an existing subclass of it. An app usually consists of multiple activities. One activity in an app is specified as the main activity, which is presented to the user when launching the app for the first time (defined in the manifest.xml file). An activity can start activities of the app (and also from other apps). Each time a new activity starts, the previous activity is stopped, but the system preserves the activity in a stack (Back Stack). Activities can move into the background and then be resumed with their state restored. 3 / 33
Back Stack Activities are arranged in a stack (Back Stack), in the order in which each activity is opened. Activities in the stack are never rearranged, only pushed and popped from the stack. Pushed onto the stack when started by the current activity. Popped off when the user leaves it using the Back button. 4 / 33
Activity States 5 / 33
Activity Lifecycle 6 / 33
Activity Lifetime (I) The entire lifetime of an activity happens between the call to oncreate and the call to ondestroy. Perform setup of global state (such as defining layout) in oncreate, and release all remaining resources in ondestroy. For example, if your activity has a thread running in the background to download data from the network, it might create that thread in oncreate and then stop the thread in ondestroy. The visible lifetime of an activity happens between the call to onstart and the call to onstop. The user can see the activity on-screen and interact with it. The system might call onstart and onstop multiple times during the entire lifetime of the activity, as the activity alternates between being visible and hidden to the user. 7 / 33
Activity Lifetime (II) The foreground lifetime of an activity happens between the call to onresume and the call to onpause. The activity is in front of all other activities on screen and has user input focus. An activity can frequently transition in and out of the foreground For example, onpause is called when the device goes to sleep or when a dialog appears. The code in these two methods should be fairly lightweight in order to avoid slow transitions that make the user wait. 8 / 33
Using lifecycle callbacks (I) Use the oncreate callback to: Initialize the essential components of your activity. (Most important) call setcontentview method to define the layout for the activity. Use the onpause callback to: Stop animations or other ongoing actions that could consume CPU. Commit unsaved changes, but only if users expect such changes to be permanently saved when they leave (such as a draft email). Release system resources, such as broadcast receivers, handles to sensors (like GPS), or any resources that may affect battery life while your activity is paused and the user does not need them. 9 / 33
Using lifecycle callbacks (II) Use onresume callback to: Initialize components that you release during onpause Perform any other initializations that must occur each time the activity enters the Resumed Use onstop callback to: Perform larger, more CPU intensive shut-down operations, such as writing information to a database. 10 / 33
onsaveinstancestate &onrestoreinstancestate These two methods are intended specifically for saving and restoring the dynamic state of an activity. onrestoreinstancestate(bundle savedinstancestate) To this method is passed a Bundle object containing the previous state data. This method is typically used in situations where it makes more sense to restore a previous state after the initialization of the activity has been performed in oncreate and onstart. onsaveinstancestate(bundle outstate) To the method is passed the Bundle object into which the state should be saved and which is subsequently passed through to the oncreate and onrestoreinstancestate methods when the activity is restarted. 11 / 33
12 / 33 UI Events
Handling events and messages The Android framework maintains an event/message queue into which events are placed as they occur. Events/messages are removed from the queue on a first-in, first-out (FIFO) basis. 13 / 33
Event listeners Event Listeners It is an interface in the View class that contains a callback method. Callback method is invoked when the View is triggered by user interaction. Event Listeners Registration It is the process by which an Event Handler gets registered with an Event Listener so that the handler is called when the Event Listener fires the event. Event Handlers It is the callback method that actually handles the event. 14 / 33
15 / 33 Intents
What is an Intent An Intent is a messaging object you can use to request an action from another app component. Intents facilitate communication between components in several ways. 16 / 33
What is in an Intent An Intent object carries information that the Android system uses to determine which component to start, plus information that the recipient component uses in order to properly perform the action. The primary information contained in an Intent is the following: Component name: The name of the component to start. Action: A string that specifies the generic action to perform (such as view or pick). Data: The URI (a Uri object) that references the data to be acted on and/or the MIME type of that data. Category: A string containing additional information about the kind of component that should handle the intent. Extras: Key-value pairs that carry additional information required to accomplish the requested action. Flags: Flags defined in the Intent class that function as metadata for the intent. 17 / 33
Intent Types Implicit intents Do not name a specific component, but instead declare a general action to perform, which allows a component from another app to handle it. For example, if you want to show the user a location on a map, you can use an implicit intent to request that another capable app show a specified location on a map. Explicit intents Specify the component to start by name (the fully-qualified class name). Used to start a component in your own app, because you know the class name of the activity or service you want to start. 18 / 33
Implicit Intents The Android system finds the appropriate component to start by comparing the contents of the intent to the intent filters declared in the manifest file of other apps on the device. If the intent matches an intent filter, the system starts that component and delivers it the Intent object. If multiple intent filters are compatible, the system displays a dialog so the user can pick which app to use. 19 / 33
Explicit intents The system starts the app component specified in the Intent object. Illustration of how an implicit intent is delivered through the system to start another activity: 1. Activity A creates an Intent with an action description and passes it to startactivity(). 2. The Android System searches all apps for an intent filter that matches the intent. When a match is found 3. the system starts the matching activity (Activity B) by invoking its oncreate() method and passing it the Intent. 20 / 33
Intent-Filter (I) < activity android :name =" MainActivity "> <!-- This activity is the main entry, should appear in app launcher --> <intent - filter > < action android :name =" android. intent. action.main " /> < category android :name =" android. intent. category. LAUNCHER " /> </ intent - filter > </ activity > < activity android :name =" ShareActivity "> <!-- This activity handles " SEND " actions with text data --> <intent - filter > < action android :name =" android. intent. action.send "/> < category android :name =" android. intent. category. DEFAULT "/> <data android : mimetype ="text / plain "/> </ intent - filter > <!-- This activity also handles "SEND " and " SEND_MULTIPLE " with media data --> <intent - filter > < action android :name =" android. intent. action.send "/> < action android :name =" android. intent. action. SEND_MULTIPLE "/> < category android :name =" android. intent. category. DEFAULT "/> <data android : mimetype =" application /vnd. google. panorama360 + jpg "/> <data android : mimetype =" image /*"/> <data android : mimetype =" video /*"/> </ intent - filter > </ activity > 21 / 33
Intent-Filter (II) 22 / 33
23 / 33 Practice
Activity lifecycle app (I) 24 / 33
Activity lifecycle app (II) 25 / 33
Working with Intents (I) Passing data to launched Activity 26 / 33
Working with Intents (II) Receiving data from launched Activity 27 / 33
Working with Intents (III) Launching Activity from other App 28 / 33
29 / 33 Assignment
Assignment (I) Create a ListView based app. Each item of the ListView is a string. Functionalities: Add Delete Edit 30 / 33
Assignment (II) Add, implemented as an Option Menu. 31 / 33
Assignment (III) Delete, implemented as a Context Menu. 32 / 33
Assignment (IV) Edit, implemented as a Context Menu. 33 / 33