Das Android-SDK – eine Einführung
von Achim Zimmer
In letzter Zeit wurde viel über das gPhone von Google spekuliert und geschrieben. Inzwischen wurde der Schleier gelüftet und am 23. September wurde der Öffentlichkeit das erste auf Android basierende Smartphone präsentiert. Doch die Meinungen sind geteilt. Viele sprechen von einem iPhone-Abklatsch. Zugegeben, die Nähe des neuen T-Mobile G1 – so der offizielle Name – zum Kult-Smartphone ist kaum zu übersehen. Folglich sind Grabenkämpfe zwischen Apple- und Google-Anhängern vorprogrammiert. Dabei wird jedoch oft eines vergessen: Die eigentliche Innovation ist nicht das Handy, sondern sein Betriebssystem!
Das G1 ist nur das erste einer langen Reihe von Android-Handys, denn: Android wird unter eine Open-Source-Lizenz gestellt und damit für viele Handyhersteller interessant. Schließlich können diese das Betriebssystem lizenzkostenfrei für ihre Geräte verwenden. Zudem bietet Android größtmögliche Freiheit bei der individuellen Anpassung an ihre Geräte. Darüber hinaus kann jedermann Anwendungen für Android entwickeln und publizieren, ohne auf Restriktionen achten zu müssen. Im Folgenden soll daher ein Einblick in das Android-SDK gegeben und die grundlegenden Konzepte hinter einer Android-Anwendung erklärt werden.
ACTIVITY
Das Herz einer jeden Android-Anwendung ist die Activity. Jede Android- Applikation muss zumindest eine Activity implementieren.
Dabei stellt eine Activity einen kompletten Screen bzw. ein Fenster einer Applikation dar und verbindet Oberflächenelemente und Funktionalität miteinander.
Eine Applikation, in der man beispielsweise Kontakte verwaltet, könnte aus einer Activity bestehen, die alle Kontakte anzeigt und aus der man Kontakte auswählen kann. Eine zweite Activity wäre in diesem Fall dafür zuständig, einen einzelnen Kontakt darzustellen und zu bearbeiten. Jede Activity muss die Methode onCreate() implementieren. Diese Methode wird aufgerufen, wenn die Activity zum ersten Mal erzeugt wird.
Typische Aufgaben, die an dieser Stelle durchgeführt werden:
Layout setzen
Ein zuvor in XML definiertes Layout wird an eine Activity gebunden. Dieses Layout legt in einer Android-Anwendung das generelle Aussehen und Verhalten einer Activity oder seiner Teile fest.
Views erzeugen
Views sind einzelne GUI-Elemente. Sie werden in XML beschrieben, ihre Instanziierung erfolgt innerhalb der on- Create()- Methode.
Daten an Listen binden:
Startet der Benutzer die Kontakt-Applikation aus unserem Beispiel, so möchte er beispielsweise als Erstes eine komplette Liste seiner Kontakte sehen. Diese initiale Anzeige von Daten wird ebenfalls in der onCreate()-Methode durchgeführt. Klassischerweise werden dabei Daten – meist aus einer Datenbank – an Listen gebunden und anschließend angezeigt. Listener-Objekte erzeugen und binden Oberflächenelementen wird ein Listener- Objekt zugewiesen, damit auf Benutzereingaben reagiert werden kann.
LEBENSZYKLUS
Die onCreate()-Methode einer Activity ist nur eine einer ganzen Reihe von Methoden, die während des Lebenszyklus einer Activity aufgerufen werden. Abb. 1 zeigt den kompletten Lebenszyklus einer Activity mit seinen Stati und korrespondierenden Methoden. Die Tatsache, dass Entwickler nur wenig Einfluss auf den Lebenszyklus einer Anwendung haben, ist eine Besonderheit von Android. Die einzelnen Methoden des Lebenszyklus werden nicht explizit aufgerufen – so kann Android beispielsweise eine Activity ohne Rückmeldung terminieren, wenn Systemressourcen für wichtigere Activities gebraucht werden. Grundsätzlich kann sich eine Activity in vier Zuständen befinden.
1. Aktiv
Die Activity ist aktiv, nachdem onResume() aufgerufen wurde. Sie befindet sich vor allen anderen Activities im Vordergrund und interagiert mit dem Benutzer.
2. Pausiert
Die Activity pausiert, nachdem onPause() aufgerufen und abgearbeitet wurde. Sie befindet sich jetzt nicht mehr im Vordergrund, Teile des Screens sind jedoch noch sichtbar oder transparent sichtbar. Beispiel: Ein Popup mit einer Systemmitteilung erscheint im Vordergrund. Typischerweise werden die vom Benutzer eingegebenen Daten spätestens an dieser Stelle persistent gemacht und exklusive Ressourcenzugriffe wieder geschlossen.
3. Gestoppt
Die Activity wird gestoppt, nachdem die onStop()-Methode aufgerufen wurde. Sie ist nun überhaupt nicht mehr sichtbar. Beispiel: Ein ankommender Telefonanruf wird dem Benutzer angezeigt. An dieser Stelle werden idealerweise Broadcast- Receiver abgemeldet.
4. Terminiert
Die Activity wird terminiert, nachdem onDestroy() aufgerufen wurde. Beispiel: Android braucht Ressourcen für eine Aktivität im Vordergrund und terminiert eine gestoppte Activity. Hier werden noch letzte Ressourcen freigegeben.
SERVICES
Eine Activity ist stets an einen Screen gebunden. Das heißt: Verlässt der Anwender diesen Screen, werden alle Prozesse innerhalb dieser Activity i. d. R terminiert. Dies ist unter Umständen aber gar nicht gewollt, beispielsweise beim Abspielen von Musikdateien oder bei einem Chatprogramm, bei dem die Verbindung nicht abgebrochen werden soll, wenn der Anwender einen Anruf bekommt. Für all diese Prozesse mit langer Laufzeit gibt es in Android die Services. Services kümmern sich um Prozesse, die unabhängig vom aktuellen Benutzerfokus, das heißt von einer Activity, im Hintergrund laufen.
Intents und Intent-Filter
Ein weiterer interessanter Aspekt des Android-API liegt im Prinzip der losen Kopplung aller Applikationen und der Kommunikation zwischen den Activities über sogenannte Intents.
Grundsätzlich besteht die Möglichkeit, innerhalb einer Activity eine andere explizit aufzurufen, beispielsweise, wenn innerhalb der eigenen Applikation eine neue Activity aufgerufen wird: Wählt der Benutzer aus einer Liste von Kontakten einen Kontakt aus, wird in der Activity KontaktList die Activity KontaktDetail explizit aufgerufen.
Bisweilen ist aber zur Bauzeit der Activity nicht bekannt, wie mit bestimmten Daten zu verfahren ist und welche Activity bzw. welcher Service dafür verantwortlich ist, diese Daten darzustellen oder zu bearbeiten. So wird sich etwa in einer Anwendung, die sich um die Verwaltung von Kontakten kümmert, auch eine E-Mail-Adresse befinden. Was aber mit dieser E-Mail-Adresse zu machen ist, wenn der Benutzer diese anklickt, und welche andere Activity dafür zuständig ist, ist nicht bekannt. Möglicherweise existieren jedoch mehrere Activities in anderen Anwendungen, die mit dieser E-Mail etwas anfangen können: eine Activity zum Schreiben einer neuen Mail, eine andere, um diese E-Mail-Adresse in ein gesondertes E-Mail-Adressbuch zu übertragen.
Für solche Fälle gibt es in Android die Möglichkeit, Activities über Intents aufzurufen. Dabei wird die Activity nicht direkt, sondern implizit aufgerufen – und zwar über die Angabe der Daten, mit denen etwas gemacht werden soll, und eine sogenannte Activity Action, die ganz allgemein festlegt, was getan werden soll.
Häufig verwendete Activity Actions sind:
>>ACTION_VIEW -> Anzeige der Daten
>>ACTION_EDIT -> Bearbeiten der Daten
>>ACTION_PICK -> Anwender kann ein Element aus der Liste der Daten auswählen
>>ACTION_MAIN -> initialer Aufruf der Start-Activity
Im Gegenzug kann für jede Activity ein Intent-Filter spezifiziert werden. Auf diese Weise wird festgelegt, welcher Intent, das heißt welche Daten, in welcher Form von der Activity bearbeitet werden können. Wird ein Intent abgesetzt, prüft Android zur Laufzeit die Intent Filter der Anwendungen und startet die passende Activity. Passen mehrere Activities auf einen Intent, stellt Android den Anwender vor die Wahl.
Android Manifest.xml
Die Manifest-Datei ist die zentrale Projektbeschreibung der ganzen Applikation. Sie enthält die Struktur der Anwendung und ihrer Komponenten. Alle Activities und deren Intent-Filter, die zu einer Anwendung gehören, werden unter anderem von ihr deklariert, darüber hinaus alle Services, Broadcast-Receiver und Content Provider einer Anwendung.
Abb. 2 zeigt einen Ausschnitt aus der AndroidManifest.xml aus Googles Note- List-Demo-Applikation. Die Activity NoteEditor besitzt einen Intent-Filter (resolve_edit). Im vorliegenden Beispiel wird die Activity aufgerufen, wenn ein einzelner Datensatz (vnd.android.cursor. item) vom Typ note (vnd.google.note) entweder angezeigt oder editiert werden soll.
Fazit:
Die Möglichkeiten der Anwendungsentwicklung unter Android sind vielfältig und sehr mächtig. Hat ein Entwickler die Grundkonzepte verstanden, kann er sehr schnell erste Anwendungen bauen. Darüberhinaus beinhaltet das Android-SDK alles, was ein Entwickler benötigt: einen umfangreichen Emulator, mit dem auch Hardware-Events simuliert werden können, viele nützliche Entwickler-Tools (u. a. ein Eclipse-Plugin), zahlreiche Beispielapplikationen und eine umfangreiche Dokumentation.
Dennoch:
Eine Vielzahl an Geräten mit dem Android-Betriebssystem werden im Laufe des nächsten Jahres auf den Markt kommen und beweisen müssen, ob der Hype gerechtfertigt war. Denn anders als beim iPhone hängt der Erfolg nicht nur von einem Gerät ab. Zu einer noch größeren Akzeptanz würde sicherlich auch eine „Emanzipation“ von den Google-Diensten beitragen. Besitzt man nämlich keinen Google-Account, bleiben dem Nutzer einige Funktionen des G1 verwehrt.


