Start Magazin Mit Android Intents auf Du und Du

Mit Android Intents auf Du und Du

Intents gehören zu den grundlegenden Programmierbausteinen von Android. Dieser Artikel erklärt, wie Intents funktionieren und wie Sie sie nutzen.

Aktivität, Intent, Layout, Manifest, Dienst, Broadcast Receiver, Content Provider? Wenn Sie gerade angefangen haben, Anwendungen auf der Android-Plattform zu entwickeln, kommt Ihnen die Android-Terminologie möglicherweise recht eigenwillig oder geradezu verwirrend vor. Die genannten Komponenten der Android-Plattform sind alle wichtig, aber wenn Sie jetzt mit dem Programmieren von Android anfangen, dann sollten Sie sich selbst einen Gefallen tun und sich auf folgende zwei Elemente konzentrieren:

  • Aktivitäten – die funktionalen Bausteine, aus denen Anwendungen bestehen
  • Intents – der Leim, der die Aktivitäten, und damit auch Applikationen, miteinander verbindet.

Intents sind ohne Frage das Konzept, das Entwicklern am häufigsten Schwierigkeiten bereitet. Egal was für eine Anwendung Sie gerade entwickeln: Sie werden nicht darum herumkommen, Intents zu verstehen und ihre Nutzung zu lernen. Dieses Tutorial zeigt Ihnen, was Intents sind, wie sie funktionieren und wie man sie effektiv in Applikationen verwendet.

Beispiel-Code online

Für alle Interessierten haben wir eine Android-Applikation namens Good Intentions geschrieben, die beispielhaft alle Konzepte umsetzt, die dieses Tutorial behandelt. Den Quellcode zu dieser Anwendung finden Sie unter [1] auf den Google-Code-Seiten. Sie benötigen dazu auch das Android-SDK [2].

Was sind Intents?

Das Android-Betriebssystem verwendet einen asynchronen Mechanismus namens Intents für den Austausch von Nachrichten. Dadurch lassen sich im laufenden Betrieb anfallende Aufgaben mit einer dazu passenden Android-Aktivität koppeln. Sie können Intents dazu verwenden, Aktivitäten innerhalb einer Anwendung aufzurufen, innerhalb einer anderen Anwendung oder um einen Dienst zu starten [3]. Intents lassen sich auch dazu einsetzen, um eine App über Systemereignisse zu informieren.

Der Einsatz von Intents bietet sich auch an für den Wechsel von einer Aktivität zu einer anderen innerhalb Ihrer Applikation oder um mithilfe des Betriebssystems eine passende Aktivität zu finden, die eine bestimmte Aufgabe für Sie übernehmen kann. Die folgenden drei Zeilen Programmcode starten zum Beuspiel die Dialer-Applikation, wobei die zu wählende Nummer automatisch im Eingabefeld erscheint (Abbildung 1).

Uri number = Uri.parse("tel:2125551212");
Intent dial = new Intent(Intent.ACTION_DIAL, number);
startActivity(dial);
Abbildung 1: Per Intent wird ACTION_DIAL aufgerufen und die Dialer-App gestartet.
Abbildung 1: Per Intent wird ACTION_DIAL aufgerufen und die Dialer-App gestartet.

Der Anwender muss lediglich die Schaltfläche mit dem Hörersymbol betätigen und das Gespräch kann beginnen. So einfach ist das. Wenn das Gespräch vorbei ist, legt der Anwender auf und kehrt zu Ihrer Anwendung zurück.

Wie funktionieren Intents?

Wenn Sie sich eine Aktivität (android.app.Aktivität) als einen Grundstein vorstellen, auf dem alle anderen Android-Anwendungen aufbauen, dann sind Intents der Klebstoff, der diese Aktivitäten auf lockere Weise miteinander verbindet. Dadurch kann der Anwender übergangslos und flexibel von einer Aktivität auf die nächste wechseln [4].

Ein Intent-Objekt (android.content.Intent) besteht aus zwei Teilen: die Aktion, die ausgeführt wird, und die Daten, die verarbeitet werden. Wenn Sie einen Intent erstellen und verschicken, weisen Sie im Prinzip das Betriebssystem an, eine vorher definierte Aufgabe an eine bestimmte Aktivität zu delegieren. So ruft zum Beispiel ein Intent, der die Aktion ACTION_VIEW ausführt und als Datenquelle die URL einer Webseite bekommt, die Browser-Aktivität auf, da diese Aktivität die geforderte Kombination aus Aktion und Datenquelle unterstützt.

Uri address = Uri.parse("http://www.perlgurl.org");
Intent surf = new Intent(Intent.ACTION_VIEW, address);
startActivity(surf);

Das Android-Betriebssystem sucht nach der passenden Aktivität für die im Intent festgelegte Kombination aus Aktion und Datenquelle und wird bei der Browser-Anwendung fündig. Android lädt den Browser im Vordergrund – Ihre Aktivität bleibt inaktiv im Hintergrund. Der Browser lädt die gewünschte Webseite (Abbildung 2). Wenn der Anwender den Browservorgang beendet, aktiviert Android die Aktivität, die den Intent generiert hat – Ihre App.

Abbildung 2: Dieser Intent führt die Aktion ACTION_VIEW aus, um Webinhalte zu betrachten.
Abbildung 2: Dieser Intent führt die Aktion ACTION_VIEW aus, um Webinhalte zu betrachten.

Verbessern Sie Ihre Apps durch Intents

Intents eignen sich hervorragend, um Ihre Anwendungen um ein paar mächtige Funktionen zu erweitern. Mit Intents lassen sich unter anderem folgende Aufgaben lösen:

  • Eine E-Mail- oder SMS-Applikation starten und eine Nachricht versenden
  • Die Browser-Anwendung aufrufen und eine Internetseite öffnen oder eine Internetsuche durchführen
  • Die Dialer-App starten und eine bestimmte Nummer wählen
  • Die Maps-Anwendung aufrufen und gezielt eine Kartenposition auswählen
  • Die Kamera-Anwendung starten und ein Foto machen oder ein Video aufnehmen
  • Die Gallery-Anwendung starten und ein Foto auswählen
  • Die Kontakteverwaltung starten und einen Eintrag auswählen
  • Sprachaufnahmen machen und die Aufnahme mit der Spracherkennungssoftware bearbeiten

Wie finden sich Intent und Aktivität?

Android führt genau Buch über alle auf einem Gerät installierten Anwendungen sowie über alle Aktivitäten, die im Android-Manifest deklariert wurden. Die <activity>-Definition in der Manifest-Datei bestimmt, welche Aktionen und Datentypen eine Aktivität verarbeiten kann; diese Fähigkeiten veröffentlicht Android per Intent-Filter. Das System nutzt diese Informationen, um einen Intent mit den Aktivitäten zu verknüpfen. Dabei wählt es die Aktivität, die am Besten dazu geeignet ist, den Request während der Laufzeit abzuarbeiten.

Nehmen wir uns noch einmal das Beispiel des Intents Browser vor: Die Standard-Browser-Anwendung enthält eine Aktivität mit einem Intent-Filter, der besagt, dass diese Aktivität ACTION_VIEW-Intents verarbeiten kann, wenn als Datenquelle eine Webseite angegeben ist. Unter Umständen gibt es aber weitere Anwendungen, die ebenfalls dazu in der Lage sind, zum Beispiel alternative Browser wie Fennec, Opera oder Dolphin. Wie weiß Android in diesem Fall nun, welche Anwendung am besten zum Intent passt?

Die Antwort lautet: Gar nicht! Wenn es mehrere Aktivitäten gibt, die zu einem Intent passen, dann entscheidet der Anwender, welches Programm zum Einsatz kommen soll.

Dies ist ein Merkmal, das Geräte auf Android-Basis grundlegend von anderen mobilen Plattformen unterscheidet. Die Flexibilität bei der Koppelung von Intents zahlt sich wirklich aus – sowohl für Entwickler als auch für Anwender. Diese Architektur macht es möglich, dass mehrere Anwendungen, wie zum Beispiel alternative Browser, E-Mail-Clients oder Applikationen zum Hochladen und Verwalten von Fotos im Internet und als Empfängerkomponenten für dieselben Intents dienen können.

Die Applikation im Vordergrund (zum Beispiel Ihre eigene) muss nicht wissen, welche Anwendung den Intent verarbeitet, sie muss nur die Gewissheit haben, dass der Intent verarbeitet wird. Dies bedeutet, dass der Entwickler sich kaum darum kümmern muss, welche Applikationen auf einem Gerät installiert oder verfügbar sind. Er muss keinen speziellen Programmcode für verschiedene E-Mail-Clients oder Internet-Browser schreiben. Stattdessen verwendet Ihre Anwendung Intents, um der Android-Plattform mitzuteilen, welche Aktion sie ausführen soll.

Der Nutzer entscheidet

Android spielt die Rolle des Vermittlers und übergibt die auszuführende Aufgabe an alle installierten Anwendungen, die von sich behaupten, die Anfrage bearbeiten zu können. Ein weiterer positiver Effekt besteht darin, dass Android bei neu installierten Anwendunden die Fähigkeiten der App kennt und die bereits installierten die Möglichkeiten des neuen Programms kennen. So kann es durchaus möglich sein, dass die Applikation, mit der ein Anwender schlussendlich eine bestimmte Aufgabe ausführt, noch gar nicht existiert hat, als Sie Ihre App programmiert haben.

Gibt es mehrere Anwendungen, die darum konkurrieren, eine Aufgabe zu erledigen, dann fordert Android den Anwender auf, aus einer Liste das gewünschte Programm auszuwählen (Abbildung 3). Soll ein Intent stets auf das gleiche Programm zugreifen (zum Beispiel den bevorzugten Browser), dann kann man dies über die Option Standardmäßig für diese Aktion verwenden per Häkchen einstellen.

Abbildung 3: Mehrere Apps können die selben Intent-Typen unterstützen. Der Anwender wählt aus, welches Programm zum Einsatz kommen soll. Das Beispiel zeigt die Browser-Auswahl für den Intent ACTION_VIEW, um Webinhalte anzuzeigen.
Abbildung 3: Mehrere Apps können die selben Intent-Typen unterstützen. Der Anwender wählt aus, welches Programm zum Einsatz kommen soll. Das Beispiel zeigt die Browser-Auswahl für den Intent ACTION_VIEW, um Webinhalte anzuzeigen.

Nehmen wir ein anderes Beispiel. Anwender wollen häufig digitale Fotos im Internet mit ihren Freunden teilen. Eine Anwendung könnte nun einen Intent mit dem Aktionstyp ACTION_SEND erzeugen und als Datenquelle eine Bilddatei festlegen. Viele Anwendungen unterstützen diese Art von Intent, wie in Abbildung 4 gezeigt, aber jede App führt das Hochladen des Bildes auf ihre eigene Art und Weise durch. So fügt zum Beispiel der E-Mail-Client das Foto als Anhang zu einer neuen E-Mail hinzu (Abbildung 5), wohingegen Facebook- und Twitter-Apps das Foto direkt in das soziale Netzwerk hochladen.

Abbildung 4: Viele Anwendungen unterstützen Intents, bei denen die Aktion ACTION_SEND zum Hochladen von Bildern ausgeführt werden soll.
Abbildung 4: Viele Anwendungen unterstützen Intents, bei denen die Aktion ACTION_SEND zum Hochladen von Bildern ausgeführt werden soll.

Abbildung 5: Wenn Sie den E-Mail-Client zur Ausführung der Aktion ACTION_SEND auswählen, wird die Bilddatei im nächsten Schritt als Anhang in eine neue E-Mail eingefügt.
Abbildung 5: Wenn Sie den E-Mail-Client zur Ausführung der Aktion ACTION_SEND auswählen, wird die Bilddatei im nächsten Schritt als Anhang in eine neue E-Mail eingefügt.

Abbildung 6: Wenn Sie z.B eine Social-Media-Anwendung wie die Facebook-App auswählen, wird die Bilddatei in Ihr Konto auf der Plattform hochgeladen (zum Beispiel in das Fotoalbum mit Handy-Uploads).
Abbildung 6: Wenn Sie z.B eine Social-Media-Anwendung wie die Facebook-App auswählen, wird die Bilddatei in Ihr Konto auf der Plattform hochgeladen (zum Beispiel in das Fotoalbum mit Handy-Uploads).

Aber was passiert, wenn keine passende Anwendung auf dem Gerät installiert ist? Ihr Applikation kann überprüfen, ob Aktivitäten auf dem Gerät existieren, die zum Ausführen bestimmter Intents geeignet sind. Dazu kommen die Methoden, die die PackageManager-Klasse deklariert zum Einsatz, zum Beispiel queryIntentActivities() oder queryBroadcastReceivers(). Diese Methoden ermöglichen es Ihnen, den Nutzern Ihres Programms Funktionen anzubieten, die nur dann aktiv sind, wenn entsprechende Applikationen auf dem Gerät existieren, die die nötigen Aktionen auch ausführen können.

Verschiedene Aktionen in Intents

Es gibt eine Reihe von Standard-Aktionen, wie zum Beispiel ACTION_VIEW, ACTION_EDIT und ACTION_SEND, die auf der Android-Plattform universell einsetzbar sind. Wenn Sie in Ihren Intents diese Standard-Aktionstypenverwenden, dann können Sie davon ausgehen, dass Ihre Apps mit anderen Android-Anwendungen kompatibel sind. Da mit jeder neuen Android-Version neue Aktionstypen hinzukommen, sollten Sie sich aber in puncto Kompatibilität mit der Android-Entwicklerdokumentation vertraut machen.

Als Entwickler können Sie auch eigene Aktionen und Datentypen für ihre Intents schaffen. Durch die Verwendung von maßgeschneiderten Intents lassen sich komplexe Software-Applikationen entwickeln. Wenn Sie jedoch anderen Entwicklern die Möglichkeit bieten wollen, ihre Applikationen in Ihr Programm zu integrieren, dann müssen Sie alle die von Ihrer Anwendung unterstützten Intents dokumentieren. Sie sollten dazu in Betracht ziehen, die von Ihnen erstellten Intents in ein externes, zentrales Register einzutragen, zum Beispiel bei openintents.org [5].

Aktivitäten wechseln

Android-Applikationen bestehen aus mehreren Aktivitäten, wobei jede Aktivität einen Bildschirm oder eine Funktion darstellt. Während der Lebensdauer einer Anwendung wechselt der Anwender zwischen mehreren Aktivitäten. Der folgende Programmcode ruft die Methode startActivity() auf, die einen expliziten Intent enthält, der genau festlegt, welche Aktivität danach gestartet werden soll, und zwar durch den Klassennamen:

startActivity(new Intent(
getApplicationContext(),
MyOtherActivity.class));

Dieser Intent teilt der Android-Plattform mit, dass sie eine Aktivität namens MyOtherAktivität starten soll. Diese Klasse muss anderswo innerhalb der Applikation implementiert sein und muss einen Eintrag in der Android-Manifest-Datei Ihrer Anwendung haben, um einwandfrei zu funktionieren.

Alternativ können Sie die Methode startActivityForResult() zum Starten Ihrer Aktivität verwenden. Aktivitäten geben manchmal Ergebnisse an die Eltern-Aktivität zurück. So gibt zum Beispiel der Contact Picker Informationen über den Kontakt, den ein Anwender ausgewählt hat, zurück. Die Eltern-Aktivität muss eine Ergebnisrückgabe anfordern, indem die Aktivität mittels der Methode startActivotyForResult() gestartet wird. Das Ergebnis wird dann weiterverarbeitet in der Methode der Eltern-Aktivität onActivityResult(). Die Ergebnisdaten speichert das System ebenfalls innerhalb eines Intents.

Zusätzliche Informationen übermitteln

Intents lassen sich dazu verwenden, zusätzliche Informationen zwischen Aktivitäten – und folglich auch zwischen Anwendungen – zu übermitteln. Dazu fügen Sie dem Intent weitere Eigenschaften hinzu, sogenannte Extras. Jedes Extra besteht aus einer Kombination aus einer Bezeichnung und einem Wert. Sie können bestimmte Extras unter der Verwendung der Bezeichnung auslesen und schreiben, indem Sie die entsprechenden put()– oder get()-Methoden verwenden, die in der Intent-Klasse zur Verfügung stehen.

Bei der Übermittlung von zusätzliche Informationen zwischen Ihren Aktivitäten können Sie beliebige weitere Eigenschaften definieren, die Sie gerade benötigen. Es hat sich die Konvention eingebürgert, die Paketnamen der Anwendung als Präfix für die Bezeichnung des Extra zu benutzen. Im folgenden Beispielcode zeigt einen Intent mit einem Extra, das den aktuellen Level eines Spiels als ganzzahligen Wert speichert:

Intent intent = new Intent(getApplicationContext(), GameActivity.class);
intent.putExtra("com.mamlambo.mygame.LEVEL", 7);
startActivity(intent);

Die neue Aktivität GameActivity greift als Teil der onCreate()-Methode auf den Intent zu und liest aus dem Extra-Teil die Informationen zum Level aus.

Intent callingIntent = getIntent();
int helpLevel = callingIntent.getIntExtra("com.mamlambo.mygame.LEVEL", 1);

Viele der häufig eingesetzten Intents verwenden Extras. Verschiedene Intents unterstützen unterschiedliche Extras, deswegen müssen Sie in der Android-SDK-Dokumentation nachlesen, welche Extras konkret unterstützt werden. Der Intent ACTION_SEND beispielsweise wird dazu verwendet, Bild- oder Textdateien zu senden; dieser Intent ermöglicht Funktionen wie die von Social-Media-Plattformen bekannte Option Mit Freunden Teilen. Der Intent ACTION_SEND unterstützt eine Reihe von Extras, darunter EXTRA_SUBJECT, EXTRA_EMAIL, EXTRA_CC und EXTRA_BCC.

Die Aktivität, die den Intent verschickt, kann also durch diese Extras den Betreff der Nachricht angeben, mit der eine Datei verschickt werden soll, darüber hinaus lassen sich die E-Mail-Adresse sowie CC- und BCC-Empfänger bestimmen. Eine Anwendung (wie zum Beispiel ein E-Mail-Client), die diesen Intent empfängt und verarbeitet, kann diese Extras dazu benutzen, die entsprechenden Adress- und Textfelder automatisch vorzubelegen, was dem Anwender etwas Tipperei erspart.

Picker Intents

Ein sehr mächtiger Aktivitätstyp ist der Picker. Picker-Aktivitäten starten Sie über die Methode startActivityForResult(). Sie präsentieren dem Anwender ein Liste von Objekten, aus der er oder sie eine Auswahl treffen kann; das ausgewählte Objekt wird dann an die Eltern-Aktivität zurückgegeben.

Mit wenigen Zeilen Code betten Sie in Ihre Aktivität einen Picker ein, der es dem Anwender ermöglicht, ein bestimmtes Bild, einen Kontakt oder einen Klingelton auszuwählen; die Aktivität kann dann das Ergebnis weiterverarbeiten. Picker Aktivitäten startet man häufig mit der Intent-Aktion ACTION_PICK; es gibt allerdings einige spezialisierte Picker-Aktivitäten, wie zum Beispiel den Klingelton-Picker, die über eigene Aktionstypen verfügen (zum Beispiel ACTION_RINGTONE_PICKER). Ein Beispiel für eine Picker-Aktivität finden Sie im untenstehenden Listing. Als Datenquelle benutzt der Picker per URI den Speicherort der auf dem Gerät abgelegten Bilddateien, der Aktionstyp lautet ACTION_PICK. Dadurch wählt der Anwender ein Bild in der Foto-Anwendung auswählen (Abbildung 7).

Intent galleryPicker = new Intent(Intent.ACTION_PICK,
        MediaStore.Images.Media.INTERNAL_CONTENT_URI);
startActivityForResult(galleryPicker, GALLERY_PICKER_RESULT);
Abbildung 7: Auswahl eines Bildes in der Gallery-App mittels ACTION_PICK.
Abbildung 7: Auswahl eines Bildes in der Gallery-App mittels ACTION_PICK.

Systemnachrichten verbreiten

Intents lassen sich auch zur Verbreitung von wichtigen Ereignissen im gesamten Betriebssystem nutzen. Ihre Anwendungen können Intents verschicken, in die sich andere Applikationen quasi einklinken können, was ihre Funktionsfähigkeit vielfältig erweitert. So kann beispielsweise eine E-Mail-Applikation immer dann einen Broadcast-Intent verschicken, wenn eine neue E-Mail eingeht. Auch Spamschutz- oder Antivirus-Programme können auf diese Systemnachricht reagieren, indem sie die neue E-Mail einem Scan unterziehen.

Android teilt viele Systemereignisse per Broadcast mit. Wenn es beispielsweise bei niedrigem Akkustand eine Systemwarnung verschickt (ACTION_BATTERY_LOW), dann können Applikationen darauf reagieren, indem sie Daten sichern, Netzwerkaktivitäten einschränken oder akkuschonendere Betriebseinstellungen wählen. Anwendungen verschicken Broadcast-Intents mittels der Methode sendBroadcast(); um Broadcast Intents zu empfangen, müssen sie als Empfangskomponenten mit den entsprechenden Intent-Filtern registriert sein, außerdem muss ein BroadcastReceiver implementiert sein.

Fazit

Intents sind unglaublich mächtig. Sie verleihen dem Android-Betriebssystem Flexibilität hinsichtlich der auf einem Gerät verfügbaren und installierten Applikationen. Entwickler sollen sich die Zeit nehmen, sich ausführlich mit den Android Intents zu befassen und sie effektiv nutzen, um so ihre Applikationen harmonisch in das Betriebssystems zu integrieren.

Kommentiere den Artikel

Please enter your comment!
Please enter your name here