Android-Programmierung: Intent
Willemers Informatik-Ecke

Ein Intent wird für den Start einer Activity oder eines Services verwendet. Dabei enthält es Informationen über den gewünschten Adressaten und die Daten, die vom Empfänger verarbeitet werden sollen. Folgende Informationen kann die Intent enthalten:

Der Intent legt mehr oder weniger direkt die zu startende Activity oder den zu startenden Service fest. In einem Intent werden Informationen vom Aufrufer an den Aufgerufenen transportiert. Ein Intent wird nicht nur für die Kommunikation innerhalb einer App verwendet, sondern kann systemweit in einem Android-System versendet und empfangen werden.

Direkter Aufruf einer Activitiy

Der Parameter von startActivity() ist ein Intent, dessen Konstruktor zwei Parameter bekommt.
Intent intent = new Intent(this, AufgerufeneActivity.class);
startActivity(intent);
Durch den Aufruf von startActivity() wird die Ziel-Activity des übergebenen Intents gestartet.

Datenübergabe bei Activity-Wechsel

Häufig müssen an die aufgerufene Activity Daten übermittelt werden. Diese werden als Extra im Intent abgelegt. Um ein Extra zu einem Intent hinzuzufügen wird der Aufruf putExtra über das Intent aufgerufen.

Das Extra als Datenbestandteil des Intents

Ein Extra ist einer Java-Properties oder einer String-Map vergleichbar. Der erste Parameter ist ein String, der als Schlüssel dient, im zweiten Parameter werden die Daten abgelegt, die über den Key erreichbar sind.

Intent intent = new Intent(this, AufgerufeneActivity.class);
// Intent mit den Daten füllen
intent.putExtra("key1", "Irgendwelcher Text");
intent.putExtra("key2", "Nochson Text");
startActivity(intent);
Die mit putExtra gesendeten Daten werden können mit der Methode getStringExtra aus dem empfangenen Intent herausgelesen werden. Dabei wird der erste Parameter als Schlüssel verwendet.
...
public void onCreate(Bundle bundle) {
    ...
    Intent intent = getIntent();
    String data = intent.getStringExtra("key1");
    String andere = intent.getStringExtra("key2");
    ...
}

Datentypen für Extras

Die Methode putExtra ist so überladen, dass als zweiter Parameter verschiedene Datentypen übergeben werden können. Bisher wurden nur String-Paare verwendet. Aber es können auch Zahlen oder Objekte übergeben werden.

Beim Lesen des Extras muss allerdings angegeben werden, welcher Datentyp erwartet wird. So liefert getStringExtra wie gesehen einen String. getIntExtra liefert einen int und so weiter.

Um eigene Objekte zu übertragen, müssen diese Parcelable implementieren. Dann wird mit den Methoden putExtra("key", object) geschrieben und mit getParcelableExtra("key") zurückgeholt.

Fernaufruf einer Activity anhand einer ACTION

Es kann aber auch ein Intent gebildet werden, der als ersten Parameter eine ACTION erhält und als zweiten Parameter eine URI, die angibt, auf welchen Daten die Aktion ausgeführt werden soll. Wird diese Intent als Parameter an startActivity übergeben, sucht Android eine Activity, die sich um diese ACTION kümmert und übergibt dieser Activity die URI mit den Argumenten der ACTION:

Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:112"));
startActivity(intent);
Es wird vermutlich die Standard-Dialer-App aufgerufen, die dann die Telefonnummer 112 aufrufen will.

ACTION-Konstanten

Android definiert in der Klasse Intent Aktions-Bezeichner als Konstanten. Diese Aktionen werden auf der als URI übergebenen Daten oder Dateien von der gestarteten Activity ausgeübt: Als URI könnte für die Kontakte beispielsweise content://contacts angegeben werden.

Aufruf einer Webseite

Das folgende Beispiel ruft den intern vorangemeldeten Browser auf, um eine der wertvollsten Webseiten dieser Welt aufzurufen:
Intent intent = new Intent(
        Intent.ACTION_VIEW,
        Uri.parse("http://www.willemer.de/informatik")
);
startActivity(intent);

Auf Ziel-Activity prüfen

Vor dem Fernaufruf wäre es recht interessant zu erfahren, ob es überhaupt eine Acitivity gibt, die die ACTION übernimmt.

Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:112"));
PackageManager packageManager = getPackageManager();
ComponentName component = intent.resolveActivity(packageManager);
if (component != null) {
    startActivity(intent);
} else {
    // oha, kein Ziel!
}

Intent-Filter

Will eine Activity auf ACTION-Intents reagieren, erstellt sie einen Intent-Filter. Ein Intent-Filter wird in der Datei AndroidManifest.xml der Anwendung dem jeweiligen Activity-Knoten durch das Tag intent-filter hinzugefügt.
<activity android:name="MeineActivity">
    <intent-filter>
        <action ...
        <category ...
        <data ...
    </intent-filter>
</activity>
Dieses Tag hat weitere Attribute, die angeben, auf welche Intents die Activity reagiert: Die Activity, die den Intent erhält, kann diesen in der Methode onCreate auslesen.
  1. Dazu ruft sie die Methode getIntent auf.
  2. Über die Referenz auf das Intent kann Sie die Methode getData aufrufen, um an die Daten des Intents zu gelangen.
  3. getStringExtra, getIntExtra holen die Extras.
  4. Mit getAction kann die ACTION bestimmt werden, für die die Activity aufgerufen wurde.