AndroidMobileSoftware Engineering

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.

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;

 

Literaturtip


vorheriger Beitrag

UX Grundlagen - Usability

nächster Beitrag

Coding Regeln

Der Schreiberling

Markus M.

Markus M.

In den letzten 15 Jahren als Consultant und Coach für namhafte internationale Kunden und Agenturen (z.B.: IGT, Red Bull, adidas, OMV, PEZ, Volksoper Wien, Jung von Matt, spreadshirt, Philotech, Wien IT, bet-at-home, Siemens, SAE Institut, draft fcb, seso, looom, bacardi, lindt, uvm.) hat sich eine Menge Wissen angesammelt welches ich hier in diesem Blog gerne mit euch teilen möchte.

Keine Meinung

schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert