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.
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
oderACTION_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 Attributandroid:mimeType
an, um den Typ von Daten, die durch deine Aktivitäten verarbeitet werden, z. B.text/plain
oderimage/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.