Android – Intents

Intents (frei übersetzt: Absichtserklärung) sind der Kit der die Android Komponenten Activities, Services, Content Provider oder Broadcast Receiver miteinander verbindet.
Wie auch Meier und Becker et. al beschreiben werden Intents als Mechanismus für den Nachrichtenaustausch verwendet. Wobei Intents innerhalb der Anwendung sowie auch zwischen unterschiedlichen Anwendungen verwendet werden können. Darüber hinaus dienen sie auch zum Austausch von Nachrichten und Daten mit der Andorid-Plattform.
Du wirst Intents für diese Aufgaben einsetzen:
- Starten eines bestimmten Services oder einer expliziten Activity (über den Klassennamen)
- Starten einer Activity oder eines Services um eine Aktion, meist mit bestimmten Daten, auszuführen
- Einen Broadcast zu senden
Die Verwendung von Intents ist ein fundamentales Entwurfsprinzip in Android, da wir dadurch eine lose Kopplung erreichen, die uns ermöglicht Komponenten und andere Anwendungselemente einfach zu ersetzen.
Inhalte
EXPLIZITE INTENTS
Android Anwendungen bestehen meist aus einer Anzahl von zusammenhängenden Activities (Screens) die im Android Manifest eingetragen werden müssen.
Um von einer Activity zur nächsten zu wechseln ist während der Programmierung die Empfängerkomponente bekannt und kann dem Intent explizit mit dem Context als Klassenobjekt übergeben werden.
Da eine Activity Klasse von der Context Klasse abgeleitet ist, steht der Context innerhalb einer Activity über this zur Verfügung. Falls du jedoch zum Beispiel über eine innere Klasse auf den Context zugreifen möchtest hilft dir die Methode getApplicationContext weiter, die auch in der Klasse Service implementiert ist.
Beispiel: Starten einer Activty
Intent intent = new Intent(MyActivity.this, MyOtherActivity.class); startActivity(intent);
Nachdem startActivtiy aufgerufen wurde, startet der Activity Lifecycle mit created, started und resumed und bringt die neue Activity ganz oben auf den Activtity Stack.
IMPLIZITE INTENTS
Implizite Intents kennen die Empfängerkomponente nicht, sondern überlassen es dem System (Android) eine passende Komponente zu finden um eine bestimmte Aktion auszuführen. Oft möchte man Komponenten einer anderen Anwendung nutzen um zum Beispiel aus der eigenen App eine Anruf zu starten oder ein Bild zu öffnen. Das kannst du mit impliziten Intents erreichen.
Beispiel: Anruf aus eigener Anwendung absetzen
Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse(“tel:555-27032204”)); startActivity(intent);
Android löst diesen Intent auf und startet eine Activity, die auf ACTION_DIAL reagiert, normalerweise der Phone Dialer (Telefon-App) von Android. Neben der Aktion werden dem Intent auch noch Daten in Form einer URI (Uniform Resource Identifier) mitgegeben. Somit weiß die empfangende Komponente über die Aktion „was“ sie tun soll und erhält über die URI die benötigten Daten.
Intent Filter
Wir können mit einem impliziten Intent eine Activity einer fremden Anwendung öffnen. Jetzt möchte ich dir zeigen wie eine Activity deiner eigenen Anwendung auf einen impliziten Intent reagieren kann.
Dazu benutzt man einen Intent-Filter der im Android Manifest eingetragen wird.
Ein Intent Filter besteht aus 3 Elementen:
- action: die <action> besteht aus einer eindeutigen Zeichenkette und beschreibt was zu tun ist
- category: die, optionale, <category> legt fest wie eine Activity aufgerufen wird (z.B.: vollständig, als TabActivity, etc.)
- data: das, ebenfalls optionale, Element <data> filtert Intents nach einer speziellen URI, die wiederum durch das Schema, den Mime-Typ, den Pfad und durch Angabe eines Ports beschrieben werden kann.
ActivityNotFoundException – Fehlerbehandlung
Wir wissen nun wie wir implizite Intents nutzen können um Anwendungen von Dritten zu starten und wie wir eigene Activities auf implizite Intents von Drittanbieter Anwendungen filtern lassen.
Das Prinzip der losen Kopplung durch implizite Intents ermöglicht einfache Änderungen der Empfängerkomponente und meine Anwendung muss keine Kenntnisse von der Zielkomponente haben. Was passiert jedoch wenn gar keine Zielkomponente existiert die auf unseren Intent hört?
Der Package Manager von Android wirft einen Laufzeitfehler in Form einer „ActivityNotFoundException“.
Daher ist es vor dem Absenden des Intents vernünftig zu überprüfen ob ein Empänger existiert. Um das zu erreichen befragen wir den Package Manager:
PackageManager packageManager = this.getPackageManager(); Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse(“tel:555-27032204”)); int flags = PackageManager.MATCH_DEFAULT_ONLY; List actions; actions = packageManager.queryIntentActivities(intent, flags); return actions.size() > 0;
Keine Meinung