Aktivitäten von anderen Apps starten

Wenn Ihre Anwendung eine Aktion ausführen kann, die für eine andere Anwendung nützlich sein könnte, bereiten Sie sie auf das Antworten auf Aktionsanfragen vor, indem Sie den entsprechenden Intent-Filter in Ihrer Aktivität angeben.

Wenn Sie beispielsweise eine Social App erstellen, über die Nachrichten oder Fotos mit den Freunden des Nutzers geteilt werden können, unterstützen Sie den Intent ACTION_SEND. Wenn Nutzer anschließend eine Freigabeaktion in einer anderen App initiieren, wird Ihre App als Option im Auswahldialogfeld (auch als Auswahldialog bezeichnet) angezeigt (Abbildung 1).

Abbildung 1: Das Auswahldialogfeld

Damit andere Apps Ihre Aktivitäten auf diese Weise starten können, müssen Sie in Ihrer Manifestdatei ein <intent-filter>-Element für das entsprechende <activity>-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 Anwendungen 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 von Ihrer Aktivität verarbeitet werden können, sollten Sie jeden hinzugefügten Intent-Filter so spezifisch wie möglich in Bezug auf den Typ der Aktion und die Daten gestalten, die von der Aktivität akzeptiert werden.

Das System kann eine bestimmte Intent an eine Aktivität senden, wenn diese Aktivität einen Intent-Filter hat, der die folgenden Kriterien des Intent-Objekts erfüllt:

Aktion
Ein String mit dem Namen der auszuführenden Aktion. Normalerweise einer der plattformdefinierten Werte, z. B. ACTION_SEND oder ACTION_VIEW.

Geben Sie dies in Ihrem Intent-Filter mit dem Element <action> an. Der Wert, den Sie in diesem Element angeben, muss der vollständige Stringname für die Aktion und nicht die API-Konstante sein, 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 Element <data> 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 Attributen angeben, die den akzeptierten Datentyp angeben.

Hinweis:Wenn Sie keine Angaben zu den Daten Uri machen müssen, z. B. wenn Ihre Aktivität andere „zusätzliche“ Daten verarbeitet, geben Sie anstelle eines URI nur das Attribut android:mimeType an, um den Datentyp zu deklarieren, der von Ihrer Aktivität verarbeitet wird, z. B. text/plain oder image/jpeg.

Kategorie
Bietet eine zusätzliche Möglichkeit, die Aktivität zu charakterisieren, die den Intent verarbeitet, die sich normalerweise auf die Nutzergeste oder den Standort bezieht, von dem aus sie gestartet wurde. Das System unterstützt verschiedene Kategorien, die jedoch nur selten verwendet werden. Allerdings werden alle impliziten Intents standardmäßig mit CATEGORY_DEFAULT definiert.

Geben Sie dies in Ihrem Intent-Filter mit dem Element <category> an.

In Ihrem Intent-Filter können Sie angeben, welche Kriterien von Ihrer Aktivität akzeptiert werden. Dazu deklarieren Sie jedes einzelne mit entsprechenden XML-Elementen, die im Element <intent-filter> 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 Sie möchten, dass sich das Symbol im Auswahldialog vom Standardsymbol Ihrer Aktivität unterscheidet, fügen Sie android:icon in das <intent-filter>-Element ein.

Jeder eingehende Intent gibt nur eine Aktion und einen Datentyp an. Sie können jedoch in jedem <intent-filter> mehrere Instanzen der Elemente <action>, <category> und <data> deklarieren.

Wenn sich zwei Aktions- und Datenpaare 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 die Daten Uri verwenden muss, um die Empfängeradresse mithilfe des URI-Schemas send oder sendto anzugeben. Dies wird im folgenden Beispiel veranschaulicht:

<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:Damit implizite Intents empfangen werden, müssen Sie die Kategorie CATEGORY_DEFAULT in den Intent-Filter aufnehmen. Die Methoden startActivity() und startActivityForResult() behandeln alle Intents so, als würden sie die Kategorie CATEGORY_DEFAULT deklarieren. Wenn Sie dies nicht in Ihrem Intent-Filter deklarieren, werden keine impliziten Intents in Ihre Aktivität aufgelöst.

Weitere Informationen zum Senden und Empfangen von ACTION_SEND-Intents, die das Teilen von Inhalten in sozialen Netzwerken durchführen, finden Sie unter Empfangen einfacher Daten aus anderen Apps. Weitere Informationen zum Freigeben von Daten finden Sie unter Einfache Daten freigeben und Dateien freigeben.

Intent in Ihrer Aktivität verarbeiten

Wenn Sie entscheiden möchten, welche Aktion in Ihrer Aktivität ausgeführt werden soll, lesen Sie die Intent, mit der sie gestartet wird.

Rufen Sie zu Beginn Ihrer Aktivität getIntent() auf, um das Intent abzurufen, mit dem die Aktivität gestartet wurde. Sie können dies während des Lebenszyklus der Aktivität jederzeit tun, in der Regel jedoch bei ersten Callbacks wie onCreate() oder onStart().

Dies wird im folgenden Beispiel veranschaulicht:

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 zu der Aktivität zurückgeben möchten, die Ihre aufgerufen hat, rufen Sie setResult() auf, um den Ergebniscode und das Ergebnis Intent anzugeben. Wenn der Vorgang abgeschlossen ist und der Nutzer zur ursprünglichen Aktivität zurückkehrt, rufen Sie finish() auf, um die Aktivität zu schließen und zu löschen. Dies wird im folgenden Beispiel veranschaulicht:

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 dies entweder RESULT_OK oder RESULT_CANCELED. Anschließend können Sie bei Bedarf zusätzliche Daten mit einer Intent angeben.

Hinweis:Das Ergebnis wird standardmäßig auf RESULT_CANCELED gesetzt. Wenn der Nutzer also auf die Schaltfläche „Zurück“ tippt, bevor er die Aktion abgeschlossen hat und bevor Sie das Ergebnis festlegen, erhält die ursprüngliche Aktivität das Ergebnis „Abgebrochen“.

Wenn Sie einfach nur eine Ganzzahl zurückgeben möchten, die eine von mehreren Ergebnisoptionen angibt, können Sie den Ergebniscode auf einen beliebigen Wert größer als 0 setzen. Wenn Sie den Ergebniscode zum Senden einer Ganzzahl verwenden und Intent nicht einfügen 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 wenige mögliche Ergebnisse, sodass der Ergebniscode eine lokal definierte Ganzzahl (größer als 0) ist. Dies funktioniert gut, wenn Sie ein Ergebnis an eine Aktivität in Ihrer eigenen Anwendung zurückgeben, da die Aktivität, die das Ergebnis empfängt, auf die öffentliche Konstante verweisen kann, um den Wert des Ergebniscodes zu bestimmen.

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, der Ihre Aktivität gestartet hat, ein Ergebnis erwartet. Wenn die ursprüngliche Aktivität startActivityForResult() genannt wird, liefert das System das Ergebnis, das Sie an setResult() übergeben haben. Andernfalls wird das Ergebnis ignoriert.