Aktivitäten von anderen Apps starten

Wenn deine App eine Aktion ausführen kann, die für eine andere App nützlich sein könnte, auf Aktionsanfragen vorbereiten, indem Sie den entsprechenden Intent-Filter in Ihrer Aktivität aus.

Wenn Sie beispielsweise eine soziale App entwickeln, die Nachrichten oder Fotos mit den Freunden der Nutzenden teilen kann, unterstützen den Intent ACTION_SEND. Wenn Nutzer dann eine Freigabe Aktion von einer anderen App ausführen, wird Ihre App als Option in der Auswahldialogfeld (auch als Auswahldialog bezeichnet), wie in Abbildung 1 gezeigt.

Abbildung 1: Das Auswahldialogfeld.

Damit andere Apps Ihre Aktivitäten auf diese Weise starten können, müssen Sie ein <intent-filter> hinzufügen. -Element in der Manifestdatei für das entsprechende <activity>-Element hinzu.

Wenn deine App auf einem Gerät installiert ist, erkennt das System deine Absicht filtert die Informationen und fügt die Informationen zu einem internen Katalog von Intents hinzu, der von allen installierten Apps unterstützt wird. Wenn eine App startActivity() oder startActivityForResult() aufruft mit einem impliziten Intent sucht, sucht das System nach Aktivitäten, die Nutzerabsicht verstehen.

Intent-Filter hinzufügen

Damit du richtig definieren kannst, welche Intents deine Aktivität verarbeiten kann, musst du jeden hinzugefügten Intent-Filter erstellen so genau wie möglich in Bezug auf die Art der Aktion und die Daten, akzeptiert.

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

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

Geben Sie dies im Intent-Filter mit dem Element <action> an. Bei dem Wert, den Sie in diesem Element angeben, muss es sich um den vollständigen Stringnamen für die Aktion handeln, nicht um den Wert API-Konstante, wie in den Beispielen auf dieser Seite gezeigt.

Daten
Eine Beschreibung der mit dem Intent verknüpften Daten.

Geben Sie dies im Intent-Filter mit dem Element <data> an. Verwendung einer oder mehr Attribute in diesem Element haben, können Sie den MIME-Typ, ein URI-Präfix, ein URI-Schema oder eine Kombination aus diesen und anderen, die den Datentyp angeben akzeptiert.

Hinweis:Wenn Sie keine Angaben zu den Daten machen müssen, Uri, z. B. wenn Ihre Aktivität eine andere Art von „Extra“ geben Sie anstelle eines URI nur das Attribut android:mimeType an, um den Typ von Daten, die durch deine Aktivitäten verarbeitet werden, z. B. text/plain oder image/jpeg.

Kategorie
Bietet eine zusätzliche Möglichkeit, die Aktivitäten zu charakterisieren, die den Intent verarbeiten, in der Regel damit auf die Nutzergeste oder den Standort, an dem sie gestartet wird. Es gibt verschiedene Kategorien, werden vom System unterstützt, aber selten verwendet. Alle impliziten Intents werden jedoch mit Standardmäßig CATEGORY_DEFAULT.

Geben Sie dies im Intent-Filter mit der <category> an -Elements.

Im Intent-Filter können Sie angeben, welche Kriterien Ihre Aktivität akzeptiert durch Deklarieren jedes einzelnen Elements mit entsprechenden XML-Elementen, die in der Datei <intent-filter> verschachtelt sind -Elements.

Hier sehen Sie 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 Auswahldialogfeld unterscheidet. vom Standardsymbol deiner Aktivität android:icon im <intent-filter> hinzufügen -Elements.

Für jeden eingehenden Intent werden nur eine Aktion und ein Datentyp angegeben. Sie können jedoch auch mehrere Instanzen der Elemente <action>, <category> und <data> jeweils <intent-filter>

Wenn sich zwei Paare aus Aktion und Daten eigene Intent-Filter erstellen, um festzulegen, welche Aktionen wenn sie mit welchen Datentypen kombiniert werden.

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, da ein ACTION_SENDTO-Intent die Daten Uri zur Spezifizierung verwenden muss Die Adresse des Empfängers mithilfe des URI-Schemas send oder sendto. 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 erhalten, müssen Sie den Parameter CATEGORY_DEFAULT im Intent-Filter. Bei den Methoden startActivity() und startActivityForResult() werden alle Intents so behandelt, hat die Kategorie CATEGORY_DEFAULT festgelegt. Wenn Sie es nicht deklarieren in deinem Intent-Filter werden keine impliziten Intents auf deine Aktivität aufgelöst.

Weitere Informationen zum Senden und Empfangen von ACTION_SEND Intents zum Teilen in sozialen Netzwerken finden Sie unter Einfache Daten von anderen Apps empfangen. Nützliche Informationen zum Teilen von Daten finden Sie auch in Einfache Daten teilen und Freigabe von Dateien:

Intents in deinen Aktivitäten verarbeiten

Um zu entscheiden, welche Maßnahmen Sie bei Ihrer Aktivität ergreifen möchten, lesen Sie die Intent, mit dem er gestartet wird.

Zu Beginn der Aktivität rufen Sie getIntent() auf, um den Intent, durch die die Aktivität gestartet wurde. Du kannst das während des Lebenszyklus der Aktivität, aber in der Regel geschieht dies bei frühen Callbacks wie z. B. 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 aufgerufen hat, rufen Sie setResult() auf, um den Ergebniscode und das Ergebnis Intent anzugeben. Wenn der Vorgang abgeschlossen ist und der Nutzer zum Original zurückkehrt Aktivität, rufen Sie finish() an, um Ihre Aktivitäten schließen und zerstören. 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 beim Ergebnis immer einen Ergebniscode angeben. Im Allgemeinen ist er entweder RESULT_OK oder RESULT_CANCELED. Sie können dann können Sie bei Bedarf mit einem Intent weitere Daten angeben.

Hinweis: Als Ergebnis werden folgende Werte festgelegt: RESULT_CANCELED ist standardmäßig aktiviert. Tippt der Nutzer auf die Schaltfläche „Zurück“, bevor Sie die Aktion abschließen und bevor Sie das Ergebnis festlegen, erhält die ursprüngliche Aktivität „stornierte“ Ergebnis.

Wenn Sie nur eine Ganzzahl zurückgeben müssen, die eine von mehreren Ergebnisoptionen angibt, können Sie den Ergebniscode auf einen beliebigen Wert größer 0 setzen. Wenn Sie mithilfe des Ergebniscodes eine Ganzzahl liefern und müssen Intent nicht angegeben werden, kannst du setResult() anrufen und nur einen Ergebniscode übergeben:

Kotlin

setResult(RESULT_COLOR_RED)
finish()

Java

setResult(RESULT_COLOR_RED);
finish();

In diesem Fall sind möglicherweise nur wenige Ergebnisse möglich, sodass der Ergebniscode ein lokal definierten Ganzzahl (größer als 0) Das funktioniert gut, wenn Sie ein Ergebnis für eine Aktivität zurückgeben. in Ihrer eigenen App verwenden, da die Aktivität, die das Ergebnis erhält, auf öffentliche Konstante, um den Wert des Ergebniscodes zu bestimmen.

Hinweis:Sie müssen nicht prüfen, ob Ihre Aktivität begonnen hat. mit startActivity() oder startActivityForResult(). Rufen Sie einfach setResult() auf, wenn der Intent, der Ihre Aktivität gestartet hat, ein Ergebnis zu erwarten ist. Wenn die Ursprungsaktivität startActivityForResult() heißt, liefert das System sie das Ergebnis, das Sie an setResult() übergeben; Andernfalls wird das Ergebnis ignoriert.