Wenn Ihre App eine Aktion ausführen kann, die für eine andere App nützlich sein könnte, bereiten Sie sie darauf vor, auf Aktionsanfragen zu reagieren. Dazu geben Sie in Ihrer Aktivität den entsprechenden Intent-Filter an.
Wenn Sie beispielsweise eine Social-Media-App entwickeln, mit der Nachrichten oder Fotos mit den Freunden des Nutzers geteilt werden können, unterstützen Sie den Intent ACTION_SEND.
Wenn Nutzer dann eine „Teilen“-Aktion aus einer anderen App starten, wird Ihre App im Auswahl-Dialogfeld (auch Dialogfeld zur Unterscheidung genannt) als Option angezeigt, wie in Abbildung 1 dargestellt.
Abbildung 1 : Das Auswahl-Dialogfeld.
Damit andere Apps Ihre Aktivität auf diese Weise starten können, müssen Sie in der Manifestdatei für das entsprechende <activity> Element ein <intent-filter>
Element hinzufügen.
Wenn Ihre App auf einem Gerät installiert ist, identifiziert das System Ihre Intent-Filter und fügt die Informationen einem internen Katalog von Intents hinzu, die von allen installierten Apps unterstützt werden.
Wenn eine App startActivity() oder startActivityForResult() mit einem impliziten Intent aufruft, sucht das System nach Aktivitäten, die auf den Intent reagieren können.
Intent-Filter hinzufügen
Um richtig zu definieren, welche Intents Ihre Aktivität verarbeiten kann, sollten Sie jeden Intent-Filter, den Sie hinzufügen, so spezifisch wie möglich in Bezug auf die Art der Aktion und die Daten gestalten, die die Aktivität akzeptiert.
Das System kann einen bestimmten Intent an eine Aktivität senden, wenn diese Aktivität
einen Intent-Filter hat, der die folgenden Kriterien des Intent Objekts erfüllt:
- Aktion
- Eine String, die die auszuführende Aktion benennt. Normalerweise einer der von der Plattform definierten Werte, z. B.
ACTION_SENDoderACTION_VIEW.Geben Sie dies in Ihrem Intent-Filter mit dem
<action>Element an. Der Wert, den Sie in diesem Element angeben, muss der vollständige Stringname für die Aktion sein und nicht die API-Konstante, wie in den Beispielen auf dieser Seite gezeigt. - Daten
- Eine Beschreibung der Daten, die mit dem Intent verknüpft sind.
Geben Sie dies in Ihrem Intent-Filter mit dem
<data>Element an. Mit einem oder mehreren Attributen in diesem Element können Sie den MIME-Typ, ein URI-Präfix, ein URI-Schema oder eine Kombination aus diesen und anderen Elementen angeben, die den akzeptierten Datentyp angeben.Hinweis:Wenn Sie keine Details zum
Urider Daten deklarieren müssen, z. B. wenn Ihre Aktivität andere Arten von „zusätzlichen“ Daten anstelle eines URI verarbeitet, geben Sie nur das Attributandroid:mimeTypean, um den Typ der Daten zu deklarieren, die Ihre Aktivität verarbeitet, z. B.text/plainoderimage/jpeg. - Kategorie
- Bietet eine zusätzliche Möglichkeit, die Aktivität zu charakterisieren, die den Intent verarbeitet. Sie bezieht sich in der Regel auf die Nutzergeste oder den Ort, von dem aus sie gestartet wird. Es gibt mehrere verschiedene Kategorien, die vom System unterstützt werden, aber die meisten werden selten verwendet. Alle impliziten Intents werden jedoch standardmäßig mit
CATEGORY_DEFAULTdefiniert.Geben Sie dies in Ihrem Intent-Filter mit dem
<category>Element an.
In Ihrem Intent-Filter können Sie deklarieren, welche Kriterien Ihre Aktivität akzeptiert
Dazu deklarieren Sie jedes Kriterium mit entsprechenden XML-Elementen, die im <intent-filter>
Element verschachtelt sind.
Hier ist beispielsweise eine Aktivität mit einem Intent-Filter, der den Intent ACTION_SEND verarbeitet, wenn der Datentyp entweder Text oder ein Bild ist:
<activity android:name="ShareActivity"> <intent-filter> <action android:name="android.intent.action.SEND"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeType="text/plain"/> <data android:mimeType="image/*"/> </intent-filter> </activity>
Tipp: Wenn das Symbol im Auswahl-Dialogfeld vom Standardsymbol Ihrer Aktivität abweichen soll, fügen Sie android:icon im <intent-filter>Element hinzu.
Jeder eingehende Intent gibt nur eine Aktion und einen Datentyp an. Sie können jedoch mehrere
Instanzen der Elemente <action>, <category> und <data> in jedem
<intent-filter> deklarieren.
Wenn sich zwei Paare aus Aktion und Daten in ihrem Verhalten gegenseitig ausschließen, erstellen Sie separate Intent-Filter, um anzugeben, welche Aktionen in Kombination mit welchen Datentypen akzeptabel sind.
Angenommen, Ihre Aktivität verarbeitet sowohl Text als auch Bilder für die Intents ACTION_SEND und ACTION_SENDTO. In diesem Fall müssen Sie zwei separate
Intent-Filter für die beiden Aktionen definieren, da ein ACTION_SENDTO Intent den Daten-Uri verwenden muss, um die Adresse des Empfängers mit dem send oder sendto URI-Schema anzugeben. Dies wird im folgenden Beispiel gezeigt:
<activity android:name="ShareActivity"> <!-- Filter for sending text; accepts SENDTO action with sms URI schemes --> <intent-filter> <action android:name="android.intent.action.SENDTO"/> <category android:name="android.intent.category.DEFAULT"/> <data android:scheme="sms" /> <data android:scheme="smsto" /> </intent-filter> <!-- Filter for sending text or images; accepts SEND action and text or image data --> <intent-filter> <action android:name="android.intent.action.SEND"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeType="image/*"/> <data android:mimeType="text/plain"/> </intent-filter> </activity>
Hinweis:Um implizite Intents zu empfangen, müssen Sie die Kategorie CATEGORY_DEFAULT in den Intent-Filter aufnehmen. Die Methoden startActivity() und startActivityForResult() behandeln alle Intents so, als ob sie die Kategorie CATEGORY_DEFAULT deklariert hätten. Wenn Sie sie nicht in Ihrem Intent-Filter deklarieren, werden keine impliziten Intents zu Ihrer Aktivität aufgelöst.
Weitere Informationen zum Senden und Empfangen von ACTION_SEND
Intents, die Social-Sharing-Verhalten ausführen, finden Sie unter Einfache Daten von anderen Apps empfangen.
Außerdem finden Sie unter
Einfache Daten teilen und
Dateien teilen nützliche Informationen zum Teilen von Daten.
Intent in Ihrer Aktivität verarbeiten
Um zu entscheiden, welche Aktion in Ihrer Aktivität ausgeführt werden soll, lesen Sie den Intent, der zum Starten verwendet wird.
Wenn Ihre Aktivität gestartet wird, rufen Sie getIntent() auf, um den
Intent abzurufen, mit dem die Aktivität gestartet wurde. Sie können dies jederzeit während des Lebenszyklus der Aktivität tun, aber in der Regel erfolgt dies bei frühen Callbacks wie onCreate() oder onStart().
Dies wird im folgenden Beispiel gezeigt:
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.main) val data: Uri? = intent?.data // Figure out what to do based on the intent type if (intent?.type?.startsWith("image/") == true) { // Handle intents with image data } else if (intent?.type == "text/plain") { // Handle intents with text } }
Java
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // Get the intent that started this activity Intent intent = getIntent(); Uri data = intent.getData(); // Figure out what to do based on the intent type if (intent.getType().indexOf("image/") != -1) { // Handle intents with image data } else if (intent.getType().equals("text/plain")) { // Handle intents with text } }
Ergebnis zurückgeben
Wenn Sie ein Ergebnis an die Aktivität zurückgeben möchten, die Ihre Aktivität aufgerufen hat, rufen Sie setResult() auf, um den Ergebniscode und den Ergebnis-Intent anzugeben. Wenn der Vorgang abgeschlossen ist und der Nutzer zur ursprünglichen Aktivität zurückkehrt, rufen Sie finish() auf, um Ihre Aktivität zu schließen und zu beenden. Dies wird im folgenden Beispiel gezeigt:
Kotlin
// Create intent to deliver some kind of result data Intent("com.example.RESULT_ACTION", Uri.parse("content://result_uri")).also { result -> setResult(Activity.RESULT_OK, result) } finish()
Java
// Create intent to deliver some kind of result data Intent result = new Intent("com.example.RESULT_ACTION", Uri.parse("content://result_uri")); setResult(Activity.RESULT_OK, result); finish();
Sie müssen immer einen Ergebniscode mit dem Ergebnis angeben. In der Regel ist das entweder RESULT_OK oder RESULT_CANCELED. Bei Bedarf können Sie dann zusätzliche Daten mit einem Intent bereitstellen.
Hinweis:Das Ergebnis ist standardmäßig auf RESULT_CANCELED gesetzt. Wenn der Nutzer also vor Abschluss der Aktion und bevor Sie das Ergebnis festlegen auf die Schaltfläche „Zurück“ tippt, erhält die ursprüngliche Aktivität das Ergebnis „abgebrochen“.
Wenn Sie einfach eine Ganzzahl zurückgeben müssen, die eine von mehreren Ergebnisoptionen angibt, können Sie den Ergebniscode auf einen beliebigen Wert über 0 setzen. Wenn Sie den Ergebniscode verwenden, um eine Ganzzahl zu liefern, und den Intent nicht einbeziehen müssen, können Sie setResult() aufrufen und nur einen Ergebniscode übergeben:
Kotlin
setResult(RESULT_COLOR_RED) finish()
Java
setResult(RESULT_COLOR_RED); finish();
In diesem Fall gibt es möglicherweise nur eine Handvoll möglicher Ergebnisse. Der Ergebniscode ist also eine lokal definierte Ganzzahl (größer als 0). Das funktioniert gut, wenn Sie ein Ergebnis an eine Aktivität in Ihrer eigenen App zurückgeben, da die Aktivität, die das Ergebnis empfängt, auf die öffentliche Konstante verweisen kann, um den Wert des Ergebniscodes zu ermitteln.
Hinweis:Sie müssen nicht prüfen, ob Ihre Aktivität mit startActivity() oder startActivityForResult() gestartet wurde. Rufen Sie einfach setResult() auf, wenn der Intent, mit dem Ihre Aktivität gestartet wurde, ein Ergebnis erwartet. Wenn die ursprüngliche Aktivität startActivityForResult() aufgerufen hat, liefert das System das Ergebnis, das Sie an setResult() übergeben; andernfalls wird das Ergebnis ignoriert.