12 • First lecture: general introduction • Touches many aspects of Android programming • Quite a few times several concepts pop up at the same time • Can’t explain everything that comes up in this lecture but… • After next lectures everything that comes up today should have been explained • “recipes” • snags 12 General purpose OS for handheld devices Handhelds: resource constrained • Processing power • Memory • Persistent storage 12 What is Android? Linux-based OS for managing processes, memory and devices Support for functionality common on handhelds: telephony, video, graphics, GPS, speech etc. through Java libraries Android SDK supports most of Java Standard Edition (SE) except the standard java UI frameworks Abstract Windowing Toolkit (AWT) and Swing. Instead: own UI framework that looks a lot like the java framework 12 12 Bottom layer: Linux core and device drivers 12 Second layer: C/C++ (“native”) libraries for functionality like database access (SQLite) and access to display system (Surface Manager) 2D/3D System C library (libc) based on Berkeley Software Distribution, tuned to half the original size Android runtime: Dalvik Virtual Machine, a version of the Java VM optimized for space, performance and battery life Consequence: NO COFFEEDREGS! 12 Top layers: application framework and the actual applications 12 Fundamental Android concepts (1): the Nodes of the app • Activity – Usually represents single screen in the app and can contain one or more Views (UI components) – can be seen as a component of a program – Apps usually consist of several activities – can be seen as a Java program – Activities are a standard Java classes that extend the Activity class • Content provider (not treated – too much additional information needed) – Standard mechanism to share data among apps – By declaring a class to extend the abstract class ContentProvider and declaring a “provider” intent filter, you can expose data to other apps – Simple example app: TelephoneList • Service (not treated) – Process running in the background, comparable to Windows services 12 Fundamental Android concepts (2) • View – User interface element: basic building blocks of the user interface: label, textbox, buttons, layout managers, … – A View is a Java class with a well-defined interface of which we don’t know its implementation • Documentation of all Android-specific classes: http://developer.android.com/reference/packages.html • AndroidManifest.xml – Defines contents and behavior of the app – Package, version, (write) permissions – Lists the nodes (activities, services, providers) 12 Fundamental Android concepts (3) • Intent – Class that is used to give a generic definition of an intention to start execution of other tasks, e.g. launch another activity in the same or another app launch an app that displays a web page – Android uses the intent to select an activity to start – If you specify that you want to, e.g., display a web page Intent i = new Intent(Intent.ACTION_VIEW); i.setData(Uri.parse("http://www.tue.nl"); this.startActivity(i); // this: calling activity Android selects an app that will Start a browser to display TU/e site If more browsers are installed Android will ask which one to start – You can also specify explicitly which app should handle the request – Demo follows later (week 6) 12 Fundamental Android concepts (4) • Android Virtual Devices (AVD) (exercises) – Allow to execute the code on your PC without attaching a real handheld to your PC – Can be created in many different configurations: screen size, memory etc. – Exam: only AVD may be used, no real devices! • For those who have no Android device: tablets can be borrowed from BCF (Asus, if necessary Cherry tablets) • AVD emulates Advanced RISC Machine (ARM) • RISC: Reduced Instruction Set Computing: – simplicity of processor chip design – speed achieved by reduced set of instructions, results in “small” chip 12 Development: Eclipse with Android plug-in • • • In place of DrJava Execute apps on real device or on AVD Extensive debugging facilities both for AVD as for real device – – – – – – • • • • • Breakpoints Step over Step into Run to line (go to line where cursor is placed) Values of attributes, local variables Call stack Context sensitive help Opening Android/Java reference (browser) Inspect file system of AVD/real device with DDMS perspective Make sure that your AVD works – ask help if needed!!! Next slides: “tour” of an Android project and how to accomplish things in Eclipse until Activities are discussed 12 Create an Android project File->New->Android Application project - starts a wizard The wizard creates Hello World – A framework for your project – a basic framework for your Activity class – icons for your app – an XML file that specifies that the screen consists of a tittle bar, a layout and a label: the layout is a ViewGroup, a container that can contain other GUI elements all GUI elements inherit from the View class the outermost View is a ViewGroup, unless there is only one View – string and other resources – references to libraries needed 12 Hello World Create project with File->New->Android Application project Later more details about Activities 12 “Hello World” Structure of Eclipse project made with File->new->Android Application Project Important parts for us: src: source code Android convention: package name reflects organization (code is organized in packages) I mostly use nl.tue.win as prefix (following Google’s recommendation) gen: generated code assets: arbitrary folders/files bin: compiled code res: resources – icons, strings, colors, screen layouts,… AndroidManifest.xml: application structure 12 Hello.java source code package nl.tue.win.hello; import android.os.Bundle; import android.app.Activity; import android.view.Menu; public class Hello extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.hello); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.hello, menu); return true; } } No main()! Instead: onCreate(Bundle Observations? …) - Bundle discussed later R.layout.hello Layout file for the screen: res/layout/hello.xml 12 Hello.java (continued) • setContentView(R.layout.hello): – creates the objects defined by the XML file – sets the screen contents to the outermost View object in the XML file – displays the screen • • • • onCreateOptionsmenu: is called when GUI is created the MenuInflater creates the classes for the menu from the xml file res/menu/hello.xml menus are not treated in the lectures – not really complicated to work out how to use Result of pressing the menu button or pressing the “menu” symbol (3 squares): 12 Creating the Graphical User Interface (later more detail) The GUI is built with elements called Views A simple control is already on the “canvas”: a label A label (TextView) is used to display a text to the user • Open hello.xml in de res/layout project folder in Graphical Layout tab • Righ-click the label in the canvas or in the outline window • Select “Edit Text” • The “Resource Chooser” shows that the string has name hello_world and has a value like “Hello world!” • The string is a “resource” that is referred to by an identifier 12 Creating the Graphical User Interface (continued) • Click “New String” • • Enter a new value for the string, e.g., “Hello Class” Enter a new name for the string, e.g., “helloclass” (don’t enter the quotes in either case!) From these data, a string is added to R, a class that represents resources R.string are string resources Each resource is identified by an integer The new string is available in your program by • • • • Resources r = this.getResources(); String s = r.getString(R.string.helloclass); 12 Resources Key role in Android architecture – Resource – file (e.g. icon or file that describes layout), e.g., hello.xml – Value (string, color), e.g. the string named hello or the color white: #ffffffff – Identified by an ID in an XML file in the res directory: strings in the directory res/values pictures in the directories res/drawable, res/drawable/hdpi etc. layouts in the directory res/layout – When a file is added/changed, the Eclipse plugin automatically adds to or updates the file R.java after the file is saved (but sometimes it takes a while). – R connects the ID in the XML file with an integer that identifies it to Android – Access to resources e.g. by this.findViewById(R.id.editText1) or r.getString(R.string.hello) from an activity as shown before 12 R.Java (incomplete - comments added): package tue.win.hello; public final class R { . public static final class drawable { public static final int ic_launcher=0x7f020000; } public static final class id { public static final int editText1=0x7f050001; public static final int rl_id=0x7f050000; } public static final class layout { public static final int main=0x7f030000; } public static final class string { public static final int app_name=0x7f040001; public static final int hello=0x7f040002; } } //outer class R //inner class R.drawable. // application icon: R.drawable.ic_launcher //R.id.editText1 //R.id.rl_id // main.xml R.layout.main //strings.xml //R.string.hello : "Hello World! " In R.java, each resource is thus identified by an integer R.<inner class>.<attribute> Access to resources in Java: get an instance r of the class Resources from getResources() Access a resouce with ID id with, e.g., r.getString(int id) or r.getColor(int id) Alternatively: this.findViewById(R.id.<ID>) 12 Properties of Views All controls in the palette inherit from the View class Right-click the TextView, shows many built-in properties like Layout width/height and text color “Other Properties” has a sub menu “Defined by TextView” (properties specific for a TextView) “Inherited from View” (properties that all classes inheriting from View have) For a label, usually, we only need properties like text color font background color text direction … 12 Help Documentation of the Android classes: • • • • http://developer.android.com/reference/packages.html Quality varies; sometimes incomplete Search function: – if chosen from dropdown list: API reference – else: general search results page, often from http://developer.android.com/guide/components/index.html Context sensitive help in Eclipse: after “.”: list of functions of class (F2 to fix the pop-up screen) – very useful! 12 XML • Important role in Android applications • Allows to define multiple layouts with less (Java) code: – define layouts for both screen orientations – handle different screen resolutions – handle different screen sizes e.g. prepare layouts for different screen sizes and resolutions select one in the code that fits best to the actual screen • Manifest • Support for multi-language (example in week 6) In general: DO NOT EDIT XML directly, use the IDE GUI tools instead!!! Please, no Groundhog day experience for me! 12 XML • We avoid direct use of XML (use graphical facilities of IDE or code instead); nevertheless a few examples: – From the file res/values/strings.xml <string name="hello_world">Hello World!</string> the string “Hello World!” is identified by the name hello_world – From the file res/layout/hello.xml the xml for the label <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello_world" /> – XML is converted to code on the device itself; can lead to errors that could have been picked up in the IDE by, e.g., syntax checks if we had coded this in Java 12 “Resources” view of the string we created ( in file res/values/strings.xml; open file to see default “Resources” view): Basically, this is an editor with which we can avoid using XML directly “Graphical layout” view of the string: 12 XML view of the layout <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".Hello" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello_world" /> </RelativeLayout>> RelativeLayout: will place controls relative to parent (the layout) and to each other 12 The Manifest Describes properties of the app to Android: application structure, organizational properties, (write) permissions,… Tab page 1 – general – usually no need to edit, except Uses Sdk 12 • Sometimes needed to set minimum SDK version, in particular for Gridlayout. New version of SDK puts Min SDK version to 8 and Gridlayout needs 14 • Current SDK also sets Target SDK version to 18 (for your real device, you may have to change this and install extra Android packages – will be explained in Monday’s exercises) 12 tab page 2: Application Structure Android creates an object of a class derived from the abstract class Application All activities in the app share this object Notice: app_name (banner) Icon (launcher screen icon) Intent Filter says activity Hello can be started as main is added to launcher screen 12 Extend the app with a text box (class EditText) – allows user to enter text (demo) Two ways: 1. With the Graphical Designer: Add the EditText by dragging it (“plain text”) from the palette (tab Text Fields) to the “canvas” – notice the relation of position with respect to parent/TextView Notice: no code is added! EditText shows up in the res/layout/main.xml file Using the Graphical Designer in general saves many lines of code Note: The name “canvas” is somewhat confusing as there is also a class Canvas; the canvas here is not a canvas on which one can draw! It is the canvas of the Graphical Designer only. 12 2. 12 Add the text box with code Assign an id to the RelativeLayout (right-click in Outline and choose “Assign ID”, e.g. rl_id; save layout – we need to get hold of the instance via the id The RelativeLayout defines how its Views are laid out In the code: add attributes and add import statements (QuickFix or ctrl-shift-M) RelativeLayout rl; EditText et; In onCreate: rl= (RelativeLayout)this.findViewById(R.id.rl_id); // notice cast et = new EditText(this); rl.addView(et); Notice: this must be done after the call to setContentView, as the Views are instantiated during that call! Before the call, findViewById will return a RelativeLayout, but its value is null… 12 Activities • One screen (usually) and some functionality • When a new activity is started, Android puts the previously active one on a stack • Android builds up a stack of activities that are still “alive” but that don’t have the focus • Demo (Icons): what happens if we turn the screen? • When the screen is turned, Android kills all activities and restarts them • Likewise, when Android runs low on resources, it will also kill activities to free resources (harder to demonstrate) • Next slide: activity lifecycle. New in Android: Fragments, which have more complicated life cycle. We decided to only discuss activities. 12 Activity life cycle States: Created Started Activity Running Paused (partially visible) Stopped (hidden) When in the stopped state, Android may kill the app App process killed Activity shut down Methods shown are called by Android when transitions occur 12 Activity life cycle When the activity starts for the first time, it comes to the foreground and receives user focus Android calls various methods depending on the state changes of the activity. When the Activity does not override these, the corresponding methods of super are called. The most important ones: • onCreate – Called when activity is first created. – Also called when activity is restarted after the Stopped state – Argument of the onCreate method: used to restore critical state information When called first time argument is null – When the activity was stopped before, information that was saved in the Bundle is available (state of Views is saved by super!): when stopped, not only the method onStop() but also the method onSaveInstanceState(Bundle state) is called to allow saving state in a Bundle 12 Activity life cycle (continued) • onPause – Called when other activity comes in foreground. – If your app is, e.g., running a video you may want to pause the video. – One should also stop any action that consumes CPU cycles or uses other resources (e.g. the camera). – This is also the point to save unsaved changes (to a database or file) e.g. when the user is editing a document or an email (although the onStop method may be more appropriate). • onResume Called when activity comes to the foreground again so here you can, e.g., restart the video, reinitialize the camera, etc. 12 Activity life cycle (continued) • onStop – Called when the activity may be killed e.g., when the user receives a phone call or starts another app that hides the current one. – Activity should release most of the resources it is using. – CPU intensive work should be done here instead of in the onPause method, like saving data in a database. – Notice: the state of View objects (e.g. EditText) is retained in a Bundle and handled by the super class – hence the call super.onCreate – Wild guess: activities that use most memory (or other resources) are killed first… Demo (Icons): save and restore state Other ways to solve problem?