====== Programming Mobile Applications for Android Handheld systems, Part 1 ====== Course page: https://class.coursera.org/androidpart1-001/wiki/Module_1%3A_Android_Development_Environment\\ By Dr. Adam Porter Source code available at: https://github.com/aporter/coursera-android ===== Week 1 - Android Platform and Development Environment ===== ==== Introduction to the Android Platform ==== * We use Android SDK for development. * See http://developer.android.com/training for documentation. * Lowest layer: Linux Kernel layer * Provides permission * manage memory * handle files and network IO * device drivers * android specific: * Power management service * memory sharing * low memory killer * interprocess communication * Native libraries layer: * System C library (bionic libc) * Surface manager * Media framework * webkit * OpenGL * SQLite * Android runtime: * Core java libraries * Dalvik virtual machine: executes the apps. See video: [[http://www.youtube.com/watch?v=ptjedOZEXPM|Dalvik VM Internals by Dan Bornstein]] * Application framework layer: * Package manager: manager list of installed apps. * Window manager: handles all windows (main window, sub windows). * View system (buttons, icons, ...) * Resource manager: handle non compiled resources (strings, graphics, etc...) * Activity Manager: supports mutiples activities in an app. * ContentProvider: inter app data sharing. * LocationManager: location and movement indications. * NotificationManager: send notifications. * Application layer: * Home screen, phone dialer, web browser ==== Android Development Environment ==== * See http://developer.android.com/sdk for info on supported OS. * Ensure we have JDK6 installed (not JDK7 as it is not fully supported by android). See: http://www.oracle.com/technetwork/java/javase/downloads * Emulated Android are called Virtual Devices. * Emulators are pretty slow * Emulators have some features unavailable * With Emulator running we could do: telnet locahhost 5554 # port is an example. # then: network speed egde #or network speed full power capacity 5 power status not-charging geo fix 0.00 40.00 # Emulate incomming sms: sms send 301555555 "This is a text message" * We can have interactions between 2 emulators (calling its port number for instance) * More on emulators at: http://developer.android.com/guide/developing/devices/emulator.html * DDMS tools contains: file explorer, logcat, traceview, ui hirarchyview. * building blocks for UI elements: http://developer.android.com/design/building-blocks ===== Week 2 - Application Fundamentals and the Activity Class ===== ==== Application Fundamentals ==== * 4 building blocks (java classes) * Activity * Service * BroadcastReceiver * ContentProvider * Activity class: * Present the UI interface * Service class: * Run in the background * perform long operation * provide way for processes to request operation and share data * BroadcastReceiver: * Listens and responds to events (= intents) * Content Provider: * Store and share data. * Application building steps: - define resources and source code - build an android package (.apk) - Signing of the .apk - Installation and run of the apk * For details on building stages see: http://developer.android.com/guide/developing/building === Defining resources === * 3 types of string resources: strings/string arrays/plurals * To access strings: * From another resource: @string/string_name * in java code: R.string.string_name * To specify the language when defining strings we use the language code in the folder name: * res/values/strings.xml -> res/values-fr/strings.xml * Layouts are stored in res/layouts/*.xml * layouts may depend on device config: * res/layout-land/* : when we are in landscape mode * android will define the R class for a project === Implementing classes === * Write at least one activity. * onCreate: * restore saved state * set content view * initialze UI elements * attach code to UI elements === Package application === * Information written in AndroidManifest.xml, including: * Name of app * list of components * permissions * hardware features * minimum API level * More info on manifest files at: http://developer.android.com/guide/topics/manifest/manifest-intro.html === Install and run === * We can use the adb tool directly to install a package. * But the package needs to be manually signed first: http://developer.android.com/tools/publishing/app-signing.html ==== The Activity Class ==== * Activities should be modular. * Task: set of related activities (can be in multiple apps!) * Task backstack : navigtion between activities * Activities are pushed/poped from the task backstack. * pressing "back" will normallly kill the current activity on the stack. * Activity lifecycle * depends on user behavior (pression back ?) * can be killed be android directly. * Activity can be in Resumed/Running state. * Can also be **paused**, can be **terminated** * Can be **stopped** * Android will annonce lifecycle changes: * onCreate() * onStart() * onResume() * onPause() * onStop() * Typical order: onCreate() -> onStart() -> onResume() -> activity running. * Then activity can be stopped with: onPause() -> onStop() -> onDestroy() -> activity shutdown. * onStart() : called when activity is about to become visible. * onStop() : called when activity is about to become invisible. * onResume() : activity is about to become available for user interaction. * onPause() : activity will not be availabel for user interaction anymore. * onStop() can be skipped if android kills the activity. * API and patterns to control activities. * onCreate(): used to initialize: - call super.onCreate() - set activity content view - retain refs on UI elements - configure the UI elements. * onRestart(): called when an activity was stopped and is about to start again. * onStart(): typically to handle when **visible-only** behaviors or loading persistent application state. * onResume(): start foreground only behavior. * onPause(): kill foreground animations, save persistent states the user updated. * onStop(): caching activity states. Note that onStop() may nt be called if android kills the activity. * onDestroy(): to release activity resources. (may not be called either) * Start an activity programmatically: - Specify the activity to start in an intent. - Pass the intent to methods such as: * startActivity() * startActivityForResult() : expect a result to be sent back to our activity. * activity.setResult(code, data) -> called to assign a result to an activity. * code could be RESULT_CANCELED, RESULT_OK, etc... * activity.onActivityResult(requestCode, resultCode, data) * Configuration changes: * keyboard, orientation, locale, etc... * When changed at run time android kills the activity then restart it with the proper resources. * To speed up the process, we may: * cache an arbitrary object with the state information -> onRetainNonConfigurationInstance() * object can then be retrieved with getLastNonConfigurationInstance() (those methods are deprecated (should use fragment class instead)) * manually handle the configuration change. * Should be defined in the androidManifest.xml file. * Activity will then receive onConfigurationChanged(), will receive a configuration object with the appropriate details. ===== Week 3 - Intents, Permissions, and the Fragments Class ===== ==== The Intent Class ==== * Intent class is a data structure, can be used to represent: - An operation to be performed. - An event that has occured. * Intents provide a flexible language to specify operations to be performed. === Intent fields === * Action: (string) naming the action to be performed, like:\\ ACTION_DIAL,\\ ACTION_EDIT,\\ ACTION_SYNC,\\ ACTION_MAIN, etc...\\ Action can be set on construction or with the **setAction** method. * Data: data associated with the Intent, formated as an URI.\\ URI can be parsed with for instance:Uri.parse("tel:+155555555"); Data can be set on construction or with the **setData** method. * Category: additional info about the kind of component that should handle the intent. * Type: Specify the MIME tye of the data. (ex: image/*, image/png, image/jpeg, text/html, text/plain). If not specified, will be infered by Android. * Component: Component that should receive this intent. * Extras: map of key-value pairs * Flags: how the intent should be handled. For instance Intent.FLAG_DEBUG_LOG_RESOLUTION to get more info on the activity selected when using the intent. === Explicit Activation === * Intent can be constructed from context and class: new Intent(LoginScreen.this, HelloAndroid.class); === Implicit Activation === * Android will perform **intent resolution** : matching the intent with the properties/capabilities of the Activities installed on the device. * Activities specify **IntentFilters** which describe which operation an activity can handle (placed in AndroidManifest.xml or generated programmatically) * For resolution, Android uses the fields: Action, Data, Type and Category === Specifying IntentFilters === * In manifest.xml file: * Activity can provide a priority to decide if it should be given the priority when multiples activities match the intent. Priority should be between -1000 and 1000. * We can use the following command to retrieve info on the available intent filters:adb shell dumpsys package ==== Permissions ==== * Permission architecture * Permissions represented as string * Stored in AndroidManifest.xml file: * Declaring permissions the app uses itself: tag * Declaring permissions the app requires of other components that want to us e it. * Define and using app level permissions. * New permission defined with tag: * THen this permission is added as part of the application tag: * Component specific permissions and permissions API * Component permissions take precedence on application level permissions. * **Activity permissions**: restricts which components can start the associated activity. * **Service permissions**: restricts which component can start and bind to a service. * **BroadcastReceiver permissions**: restricts which component can send and receive broadcasts * **ContentProvider permissions**: restricts read and write the data in a contentprovider. * Android throws SecurityException on permission failure. ==== The Fragment Class ==== * Fragments represents portions of UI within an activity. * Fragments are hosted by activities (0 or more fragments). * One fragment can be used by 0 or more activities. * Fragment lifecycle is coordinated with the lifecycle of its containing activity. * Fragment can be in **running/resumed** state: visible * Can be **paused**: activity is visible but without focus. * Can be **stopped**: invisible. === Lifecycle callback methods === * onAttach() -> onCreate() -> onCreateView() -> onActivityCreated() * activity onStart() -> fragment onStart() * activity onResume() -> fragment onResume() * activity onPause() -> fragment onPause() * activity onStop() -> fragment onStop() * onDestroyView() : release the view objects. * onDestroy() : release fragment resources. * onDetach() * Fragments can be **statically** added to activity (adding them in layout file) * Fragments can be added **programmatically** using the FragmentManager: - get ref to FragmentManager - begin a FragmentTransaction - add fragment to activity - commit the FragmentTransaction. * Dynamic addition of fragments: * transaction.addTOBackStack(null) : to allow stack tracking when using the back button. * fragManager.executePendingTransactions(): to execute the pending transactions immediately. === Configuration changes === * setRetainInstance(true) : kill the activity but keep the fragment. Whan the new activity is create, the fragments onDestroy() and onCreate() methods will NOT be called. ===== Week 4 - User Interface Classes ===== ==== User Interface Classes ==== * View class * Occupy rect space, * Draw themself and handle events directed to them. * Predefined views: * Button * User can click on it. * ToggleButton * Stays pressed (2-state button) * Light indicator * Checkbox * Also a kind of 2-state button. * RatingBar: * Row of stars * AutoCompleteTextView: * Displays text * Editable * Will provide an auto complete list during typing. * View operations: * Set visibility * Change the check state * Set listener * Set orientation, opacity, background * Set the focus. * View events and operations * User interaction: * Touch * OnClickListener.onClick() * OnLongClickListener.onLongCLick() * OnFocusChangeListener.onFocusChange() * OnKeyListener.onKey() * System control * lifecycle control * onMeasure() -> provide our own measure * onLayout() * onDraw() -> draw the view * onFocusChange() * onKeyUp()/onKeuDown() * View groups: * View are organized in a tree * ViewGroups are invisible views * RadioGroup * Contains exclusive radio buttons * TimePicker * DatePicker * WebView : display a webpage * MapView : display maps and allow interaction * Adapter and AdapterViews * Child views are managed by the adapter. * ListView: * scrollable list of selectable items * adapter: ListAdapter * Spinner: * Scrollable list in dropdown list. * managed by SpinnerAdapter * Gallery: * Horizontally scrolling list * Layouts: * LinearLayout: arrange children horizontally or vertically. * RelativeLayout: positioning relative to parents and sibling. * TableLayout : rows and colunms * GridView: 2D scrollable grid. * Menus & ActionBar * Activities can add items to a menu * Activities can respond when a menu items is clicked. * We have: * Options menu: menu of the "menu button" * Context menu: shown when a view is pressed and hold * Submenu: activited from menu item. * Creating menu: * define content in res/menu/filename.xml * onCreateOptionsMenu() * onCreateContextMenu() * => use menu inflater * onXXXItemsSelected() gets called * Advanced features: * Grouping items * shortcut keys * Intents to menu items * ActionBar similar desktop menu bar. * Fragments should call setHasOptionsMenu(true) to add menu items. * ActionBar.Tab used to display multiple "tabs" * Dialogs * AlertDialog * ProgressDialog * DatePickerDialog