Ein Intent
ist ein Nachrichtenobjekt, mit dem Sie eine Aktion von einer anderen App-Komponente anfordern können.
Obwohl Intents auf verschiedene Weise die Kommunikation zwischen Komponenten erleichtern, gibt es drei grundlegende Anwendungsfälle:
- Aktivität starten
Ein
Activity
steht für einen einzelnen Bildschirm in einer App. Sie können eine neue Instanz einesActivity
starten, indem Sie einIntent
anstartActivity()
übergeben. DieIntent
beschreibt die zu startende Aktivität und enthält alle erforderlichen Daten.Wenn Sie nach Abschluss der Aktivität ein Ergebnis erhalten möchten, rufen Sie
startActivityForResult()
auf. Ihre Aktivität empfängt das Ergebnis als separatesIntent
-Objekt imonActivityResult()
-Callback Ihrer Aktivität. Weitere Informationen finden Sie im Leitfaden zu Aktivitäten. - Dienst starten
Eine
Service
ist eine Komponente, die Vorgänge im Hintergrund ohne Benutzeroberfläche ausführt. Unter Android 5.0 (API-Level 21) und höher kannst du einen Dienst mitJobScheduler
starten. Weitere Informationen zuJobScheduler
finden Sie im zugehörigenAPI-reference documentation
.Bei Versionen vor Android 5.0 (API-Level 21) können Sie einen Dienst mit Methoden der Klasse
Service
starten. Sie können einen Dienst starten, um einen einmaligen Vorgang (z. B. das Herunterladen einer Datei) auszuführen. Übergeben Sie dazuIntent
anstartService()
. DieIntent
beschreibt den Dienst, der gestartet werden soll, und enthält alle erforderlichen Daten.Wenn der Dienst mit einer Client-Server-Schnittstelle entwickelt wurde, können Sie eine Verbindung von einer anderen Komponente an den Dienst herstellen. Dazu übergeben Sie einen
Intent
anbindService()
. Weitere Informationen finden Sie im Leitfaden für Dienste. - Übertragung der Nachricht
Eine Broadcasting-Nachricht ist eine Nachricht, die jede App empfangen kann. Das System sendet verschiedene Broadcasts für Systemereignisse, z. B. den Systemstart oder den Ladevorgang des Geräts. Sie können eine Übertragung an andere Apps senden, indem Sie
Intent
ansendBroadcast()
odersendOrderedBroadcast()
übergeben.
Im weiteren Verlauf dieser Seite wird erläutert, wie Intents funktionieren und verwendet werden. Weitere Informationen finden Sie unter Mit anderen Apps interagieren und Inhalte teilen.
Intent-Typen
Es gibt zwei Arten von Intents:
- Explizite Intents geben an, welche Komponente einer Anwendung den Intent erfüllt, indem eine vollständige
ComponentName
angegeben wird. Normalerweise verwenden Sie einen expliziten Intent, um eine Komponente in Ihrer eigenen Anwendung zu starten, da Sie den Klassennamen der Aktivität oder des Dienstes kennen, den Sie starten möchten. Sie können beispielsweise als Reaktion auf eine Nutzeraktion eine neue Aktivität in Ihrer Anwendung starten oder einen Dienst starten, um eine Datei im Hintergrund herunterzuladen. - Implizite Intents benennen keine bestimmte Komponente, sondern deklarieren stattdessen eine allgemeine auszuführende Aktion. Diese kann dann von einer Komponente aus einer anderen App verarbeitet werden. Wenn Sie beispielsweise Nutzern einen Standort auf einer Karte anzeigen möchten, können Sie mit einem impliziten Intent von einer anderen kompatiblen App anfordern, dass ein bestimmter Standort auf einer Karte angezeigt wird.
Abbildung 1 zeigt, wie ein Intent beim Starten einer Aktivität verwendet wird. Wenn das Intent
-Objekt eine bestimmte Aktivitätskomponente explizit benennt, startet das System diese Komponente sofort.
Wenn Sie einen impliziten Intent verwenden, sucht das Android-System zuerst nach der passenden Komponente, um den Inhalt des Intents mit den Intent-Filtern zu vergleichen, die in der Manifestdatei anderer Apps auf dem Gerät deklariert sind. Wenn der Intent mit einem Intent-Filter übereinstimmt, startet das System diese Komponente und liefert das Objekt Intent
. Wenn mehrere Intent-Filter kompatibel sind, zeigt das System ein Dialogfeld an, in dem der Nutzer eine App auswählen kann.
Ein Intent-Filter ist ein Ausdruck in der Manifestdatei einer App, der den Intent-Typ angibt, den die Komponente empfangen möchte. Wenn Sie beispielsweise einen Intent-Filter für eine Aktivität deklarieren, können andere Apps Ihre Aktivität direkt mit einem bestimmten Intent starten. Ebenso kann die Aktivität nur mit einem expliziten Intent gestartet werden, wenn Sie keine Intent-Filter für eine Aktivität deklarieren.
Achtung:Damit Ihre Anwendung sicher ist, sollten Sie beim Starten einer Service
immer einen expliziten Intent verwenden und keine Intent-Filter für Ihre Dienste deklarieren. Die Verwendung eines impliziten Intents zum Starten eines Dienstes stellt ein Sicherheitsrisiko dar, da Sie nicht sicher sein können, welcher Dienst auf den Intent reagieren wird, und der Nutzer nicht sehen kann, welcher Dienst gestartet wird. Ab Android 5.0 (API-Ebene 21) löst das System eine Ausnahme aus, wenn Sie bindService()
mit einem impliziten Intent aufrufen.
Intent erstellen
Ein Intent
-Objekt enthält Informationen, mit denen das Android-System bestimmt, welche Komponente gestartet werden soll, z. B. den genauen Komponentennamen oder die Komponentenkategorie, die den Intent erhalten soll. Außerdem enthält es Informationen, die die Empfängerkomponente verwendet, um die Aktion richtig auszuführen (z. B. die auszuführende Aktion und die Daten, auf die ausgeführt werden soll).
Die wichtigsten in einem Intent
enthaltenen Informationen sind:
- Komponentenname
- Der Name der Komponente, die gestartet werden soll.
Dies ist optional, macht aber einen Intent explizit. Das bedeutet, dass der Intent nur an die durch den Komponentennamen definierte App-Komponente gesendet werden sollte. Ohne Komponentennamen ist der Intent implizit und das System entscheidet anhand der anderen Intent-Informationen (z. B. Aktion, Daten und Kategorie, wie unten beschrieben), welche Komponente den Intent empfangen soll. Wenn Sie eine bestimmte Komponente in Ihrer App starten müssen, geben Sie den Komponentennamen an.
Hinweis:Wenn Sie einen
Service
starten, geben Sie immer den Komponentennamen an. Andernfalls können Sie nicht sicher sein, welcher Dienst auf den Intent reagiert, und der Nutzer kann nicht sehen, welcher Dienst gestartet wird.Dieses Feld von
Intent
ist einComponentName
-Objekt, das Sie mit einem voll qualifizierten Klassennamen der Zielkomponente, einschließlich des Paketnamens der App, angeben können, z. B.com.example.ExampleActivity
. Sie können den Namen der Komponente mitsetComponent()
,setClass()
,setClassName()
oder mit dem KonstruktorIntent
festlegen. - Aktion
- Ein String, der die allgemeine auszuführende Aktion angibt, z. B. view oder pick.
Bei einem Broadcast-Intent ist dies die stattgefundene und gemeldete Aktion. Die Aktion bestimmt weitgehend, wie der Rest des Intents strukturiert ist, insbesondere die Informationen, die in den Daten und Extras enthalten sind.
Sie können Ihre eigenen Aktionen angeben, die von Intents in Ihrer Anwendung verwendet werden (oder zur Verwendung durch andere Anwendungen zum Aufrufen von Komponenten in Ihrer Anwendung), aber normalerweise geben Sie Aktionskonstanten an, die durch die
Intent
-Klasse oder andere Framework-Klassen definiert werden. Hier sind einige häufige Aktionen zum Starten einer Aktivität:ACTION_VIEW
- Verwenden Sie diese Aktion in einem Intent mit
startActivity()
, wenn Sie Informationen haben, die dem Nutzer in einer Aktivität angezeigt werden können, z. B. ein Foto, das in einer Galerie-App angezeigt wird, oder eine Adresse, die in einer Karten-App angezeigt werden soll. ACTION_SEND
- Auch als Share-Intent bezeichnet. Sie sollten diesen in einem Intent mit
startActivity()
verwenden, wenn Sie Daten haben, die der Nutzer über eine andere App, z. B. eine E-Mail-App oder eine App zum Teilen in sozialen Netzwerken, teilen kann.
Weitere Konstanten zum Definieren generischer Aktionen finden Sie in der
Intent
-Klassenreferenz. Andere Aktionen werden an anderer Stelle im Android-Framework definiert, z. B. inSettings
für Aktionen, mit denen bestimmte Bildschirme in der App „Einstellungen“ des Systems geöffnet werden.Sie können die Aktion für einen Intent mit
setAction()
oder mit einemIntent
-Konstruktor angeben.Wenn Sie eigene Aktionen definieren, achten Sie darauf, den Paketnamen Ihrer App wie im folgenden Beispiel als Präfix anzugeben:
Kotlin
const val ACTION_TIMETRAVEL = "com.example.action.TIMETRAVEL"
Java
static final String ACTION_TIMETRAVEL = "com.example.action.TIMETRAVEL";
- Daten
- Der URI (ein
Uri
-Objekt), der auf die zu verarbeitenden Daten und/oder den MIME-Typ dieser Daten verweist. Die Art der bereitgestellten Daten wird im Allgemeinen durch die Aktion des Intents bestimmt. Wenn die Aktion beispielsweiseACTION_EDIT
lautet, sollten die Daten den URI des zu bearbeitenden Dokuments enthalten.Beim Erstellen eines Intents ist es oft wichtig, neben dem URI den Datentyp (den MIME-Typ) anzugeben. Beispielsweise kann eine Aktivität, bei der Bilder angezeigt werden können, wahrscheinlich keine Audiodatei abspielen, obwohl die URI-Formate ähnlich sein könnten. Wenn Sie den MIME-Typ Ihrer Daten angeben, kann das Android-System die beste Komponente für Ihren Intent finden. Der MIME-Typ kann jedoch manchmal aus dem URI abgeleitet werden, insbesondere wenn die Daten ein
content:
-URI sind. Eincontent:
-URI gibt an, dass sich die Daten auf dem Gerät befinden und von einemContentProvider
gesteuert werden. Dadurch wird der Daten-MIME-Typ für das System sichtbar.Rufen Sie
setData()
auf, um nur den Daten-URI festzulegen. Wenn Sie nur den MIME-Typ festlegen möchten, rufen SiesetType()
auf. Bei Bedarf können Sie beide Werte explizit mitsetDataAndType()
festlegen.Achtung:Wenn Sie sowohl den URI als auch den MIME-Typ festlegen möchten, rufen Sie
setData()
undsetType()
nicht auf, da beide den Wert des jeweils anderen aufheben. Verwenden Sie immersetDataAndType()
, um sowohl den URI als auch den MIME-Typ festzulegen. - Kategorie
- Ein String mit zusätzlichen Informationen zur Art der Komponente, die den Intent verarbeiten soll. In einem Intent können beliebig viele Kategoriebeschreibungen platziert werden, für die meisten Intents ist jedoch keine Kategorie erforderlich.
Hier sind einige gängige Kategorien:
CATEGORY_BROWSABLE
- Die Zielaktivität kann von einem Webbrowser gestartet werden, um Daten anzuzeigen, auf die in einem Link verwiesen wird, z. B. ein Bild oder eine E-Mail.
CATEGORY_LAUNCHER
- Die Aktivität ist die ursprüngliche Aktivität einer Aufgabe. Sie wird im App Launcher des Systems aufgeführt.
Die vollständige Liste der Kategorien finden Sie in der Beschreibung der Klasse
Intent
.Sie können eine Kategorie mit
addCategory()
angeben.
Die oben aufgeführten Attribute (Komponentenname, Aktion, Daten und Kategorie) stellen die definierenden Eigenschaften eines Intents dar. Anhand dieser Eigenschaften kann das Android-System bestimmen, welche App-Komponente gestartet werden soll. Ein Intent kann jedoch zusätzliche Informationen enthalten, die sich nicht darauf auswirken, wie er zu einer App-Komponente aufgelöst wird. Ein Intent kann auch die folgenden Informationen bereitstellen:
- Extras
- Schlüssel/Wert-Paare, die zusätzliche Informationen enthalten, die zum Ausführen der angeforderten Aktion erforderlich sind.
Bei einigen Aktionen werden nicht nur bestimmte Arten von Daten-URIs verwendet, sondern auch bestimmte Extras.
Sie können zusätzliche Daten mit verschiedenen
putExtra()
-Methoden hinzufügen, die jeweils zwei Parameter akzeptieren: den Schlüsselnamen und den Wert. Sie können auch einBundle
-Objekt mit allen zusätzlichen Daten erstellen und dann dasBundle
mitputExtras()
in dieIntent
einfügen.Wenn Sie beispielsweise einen Intent zum Senden einer E-Mail mit
ACTION_SEND
erstellen, können Sie den Empfänger an mit dem SchlüsselEXTRA_EMAIL
und das Betreff mit dem SchlüsselEXTRA_SUBJECT
angeben.Die Klasse
Intent
gibt vieleEXTRA_*
-Konstanten für standardisierte Datentypen an. Wenn Sie eigene zusätzliche Schlüssel (für Intents, die Ihre Anwendung erhält) deklarieren müssen, müssen Sie den Paketnamen der Anwendung wie im folgenden Beispiel als Präfix angeben:Kotlin
const val EXTRA_GIGAWATTS = "com.example.EXTRA_GIGAWATTS"
Java
static final String EXTRA_GIGAWATTS = "com.example.EXTRA_GIGAWATTS";
Achtung: Verwenden Sie keine
Parcelable
- oderSerializable
-Daten, wenn Sie einen Intent senden, den eine andere Anwendung erwarten wird. Wenn eine Anwendung versucht, auf Daten in einemBundle
-Objekt zuzugreifen, aber keinen Zugriff auf die Parzellen- oder serielle Klasse hat, gibt das System den FehlerRuntimeException
aus. - Flags
- Flags werden in der Klasse
Intent
definiert, die als Metadaten für den Intent funktionieren. Die Flags können das Android-System anweisen, wie eine Aktivität gestartet werden soll (z. B. zu welcher Aufgabe die Aktivität gehören soll) und wie sie nach dem Start behandelt werden soll (z. B. ob sie in die Liste der letzten Aktivitäten gehört).Weitere Informationen finden Sie in der Methode
setFlags()
.
Beispiel für explizite Absicht
Ein expliziter Intent ist ein Intent, mit dem Sie eine bestimmte App-Komponente in Ihrer App starten, z. B. eine bestimmte Aktivität oder einen Dienst. Um einen expliziten Intent zu erstellen, definieren Sie den Komponentennamen für das Objekt Intent
. Alle anderen Intent-Eigenschaften sind optional.
Wenn Sie beispielsweise in Ihrer Anwendung einen Dienst namens DownloadService
erstellt haben, über den eine Datei aus dem Web heruntergeladen werden soll, können Sie ihn mit dem folgenden Code starten:
Kotlin
// Executed in an Activity, so 'this' is theContext
// The fileUrl is a string URL, such as "http://www.example.com/image.png" val downloadIntent = Intent(this, DownloadService::class.java).apply { data =Uri.parse
(fileUrl) } startService(downloadIntent)
Java
// Executed in an Activity, so 'this' is theContext
// The fileUrl is a string URL, such as "http://www.example.com/image.png" Intent downloadIntent = new Intent(this, DownloadService.class); downloadIntent.setData(Uri.parse
(fileUrl)); startService(downloadIntent);
Der Konstruktor Intent(Context, Class)
stellt die Anwendungs-Context
und die Komponente ein Class
-Objekt bereit. Daher startet dieser Intent explizit die Klasse DownloadService
in der App.
Weitere Informationen zum Erstellen und Starten eines Dienstes finden Sie im Leitfaden für Dienste.
Beispiel für impliziten Intent
Ein impliziter Intent gibt eine Aktion an, die jede App auf dem Gerät aufrufen kann, die die Aktion ausführen kann. Die Verwendung eines impliziten Intents ist nützlich, wenn Ihre App die Aktion nicht ausführen kann, andere Apps dies aber wahrscheinlich können und Sie möchten, dass der Nutzer die zu verwendende App auswählt.
Wenn Sie beispielsweise Inhalte haben, die der Nutzer mit anderen Personen teilen soll, erstellen Sie einen Intent mit der Aktion ACTION_SEND
und fügen Sie Extras hinzu, die die zu teilenden Inhalte angeben. Wenn du startActivity()
mit diesem Intent aufrufst, kann der Nutzer eine App auswählen, über die der Inhalt geteilt werden soll.
Kotlin
// Create the text message with a string. val sendIntent = Intent().apply { action = Intent.ACTION_SEND putExtra(Intent.EXTRA_TEXT, textMessage) type = "text/plain" } // Try to invoke the intent. try { startActivity(sendIntent) } catch (e: ActivityNotFoundException) { // Define what your app should do if no activity can handle the intent. }
Java
// Create the text message with a string. Intent sendIntent = new Intent(); sendIntent.setAction(Intent.ACTION_SEND); sendIntent.putExtra(Intent.EXTRA_TEXT, textMessage); sendIntent.setType("text/plain"); // Try to invoke the intent. try { startActivity(sendIntent); } catch (ActivityNotFoundException e) { // Define what your app should do if no activity can handle the intent. }
Wenn startActivity()
aufgerufen wird, prüft das System alle installierten Apps, um festzustellen, welche diese Art von Intent verarbeiten können (ein Intent mit der Aktion ACTION_SEND
, der Text-/Klardaten enthält). Wenn es nur eine App gibt, die das verarbeiten kann, wird diese App sofort geöffnet und erhält den Intent. Wenn keine andere Anwendung damit umgehen kann, kann die Anwendung das auftretende ActivityNotFoundException
abfangen. Wenn mehrere Aktivitäten den Intent akzeptieren, blendet das System ein Dialogfeld ein (siehe Abbildung 2), in dem der Nutzer die gewünschte App auswählen kann.
Weitere Informationen zum Starten anderer Apps finden Sie auch im Leitfaden zum Senden des Nutzers an eine andere App.
App-Auswahl erzwingen
Wenn mehrere Anwendungen auf Ihren impliziten Intent reagieren, kann der Nutzer auswählen, welche Anwendung verwendet werden soll, und diese Anwendung als Standard für die Aktion festlegen. Die Möglichkeit, eine Standardeinstellung auszuwählen, ist hilfreich, wenn der Nutzer eine Aktion ausführen möchte, für die er wahrscheinlich jedes Mal dieselbe App verwenden möchte, z. B. beim Öffnen einer Webseite (Nutzer bevorzugen oft nur einen Webbrowser).
Wenn jedoch mehrere Anwendungen auf den Intent reagieren können und der Nutzer möglicherweise jedes Mal eine andere Anwendung verwenden möchte, sollte explizit ein Auswahldialogfeld angezeigt werden. Im Auswahldialogfeld wird der Nutzer aufgefordert, die App auszuwählen, die für die Aktion verwendet werden soll. Er kann keine Standard-App für die Aktion auswählen. Wenn Ihre App beispielsweise „Teilen“ mit der Aktion ACTION_SEND
ausführt, möchten Nutzer die Inhalte je nach ihrer aktuellen Situation möglicherweise mit einer anderen App teilen. Verwenden Sie daher immer das Auswahldialogfeld (siehe Abbildung 2).
Erstellen Sie zum Einblenden der Auswahl ein Intent
mit createChooser()
und übergeben Sie es an startActivity()
, wie im folgenden Beispiel gezeigt.
In diesem Beispiel wird ein Dialogfeld mit einer Liste von Apps angezeigt, die auf den an die Methode createChooser()
übergebenen Intent reagieren und den angegebenen Text als Dialogfeldtitel verwenden.
Kotlin
val sendIntent = Intent(Intent.ACTION_SEND) ... // Always use string resources for UI text. // This says something like "Share this photo with" val title: String = resources.getString(R.string.chooser_title) // Create intent to show the chooser dialog val chooser: Intent = Intent.createChooser(sendIntent, title) // Verify the original intent will resolve to at least one activity if (sendIntent.resolveActivity(packageManager) != null) { startActivity(chooser) }
Java
Intent sendIntent = new Intent(Intent.ACTION_SEND); ... // Always use string resources for UI text. // This says something like "Share this photo with" String title = getResources().getString(R.string.chooser_title); // Create intent to show the chooser dialog Intent chooser = Intent.createChooser(sendIntent, title); // Verify the original intent will resolve to at least one activity if (sendIntent.resolveActivity(getPackageManager()) != null) { startActivity(chooser); }
Unsichere Intent-Starts erkennen
Ihre App kann Intents starten, um innerhalb Ihrer App zwischen Komponenten zu wechseln oder eine Aktion im Namen einer anderen App auszuführen. Zur Verbesserung der Plattformsicherheit bietet Android 12 (API-Level 31) und höher eine Debugging-Funktion, die Sie warnt, wenn Ihre App einen unsicheren Start eines Intents durchführt. Beispiel: Ihre Anwendung führt einen unsicheren Start eines verschachtelten Intents aus. Dies ist ein Intent, der als zusätzlicher Intent in einem anderen Intent übergeben wird.
Wenn Ihre App die beiden folgenden Aktionen ausführt, erkennt das System einen unsicheren Intent-Start und es tritt ein StrictMode-Verstoß auf:
- Ihre App hebt einen verschachtelten Intent von den Extras eines übermittelten Intents auf.
- Ihre Anwendung startet sofort eine Anwendungskomponente mit diesem verschachtelten Intent. Dazu wird der Intent z. B. an
startActivity()
,startService()
oderbindService()
übergeben.
Weitere Informationen dazu, wie Sie diese Situation erkennen und Änderungen an Ihrer App vornehmen können, finden Sie im Blogpost zu Nesting Intents für Android auf Medium.
Auf unsichere Intent-Starts prüfen
Wenn Sie in Ihrer App nach unsicheren Intent-Starts suchen möchten, rufen Sie beim Konfigurieren von VmPolicy
detectUnsafeIntentLaunch()
auf, wie im folgenden Code-Snippet gezeigt. Wenn Ihre Anwendung einen StrictMode-Verstoß erkennt, sollten Sie die Ausführung der Anwendung stoppen, um potenziell vertrauliche Informationen zu schützen.
Kotlin
fun onCreate() { StrictMode.setVmPolicy(VmPolicy.Builder() // Other StrictMode checks that you've previously added. // ... .detectUnsafeIntentLaunch() .penaltyLog() // Consider also adding penaltyDeath() .build()) }
Java
protected void onCreate() { StrictMode.setVmPolicy(new VmPolicy.Builder() // Other StrictMode checks that you've previously added. // ... .detectUnsafeIntentLaunch() .penaltyLog() // Consider also adding penaltyDeath() .build()); }
Intents verantwortungsvoller einsetzen
Beachten Sie die folgenden Best Practices, um das Risiko eines unsicheren Intents und eines StrictMode-Verstoßes zu minimieren.
Kopieren Sie nur die wesentlichen Extras innerhalb der Intents und führen Sie alle erforderlichen Bereinigungen und Validierungen durch. Ihre App kopiert die Extras möglicherweise von einem Intent in einen anderen Intent, der zum Starten einer neuen Komponente verwendet wird. Dies tritt auf, wenn Ihre Anwendung putExtras(Intent)
oder putExtras(Bundle)
aufruft.
Wenn Ihre App einen dieser Vorgänge ausführt, kopieren Sie nur die Extras, die die empfangende Komponente erwartet. Wenn der andere Intent, der die Kopie erhält, eine nicht exportierte Komponente startet, bereinigen und validieren Sie die Extras, bevor Sie sie in den Intent kopieren, der die Komponente startet.
Exportieren Sie die Komponenten Ihrer App nicht unnötig. Wenn Sie beispielsweise eine App-Komponente mit einem internen verschachtelten Intent starten möchten, setzen Sie das Attribut android:exported
dieser Komponente auf false
.
Verwenden Sie einen PendingIntent
anstelle eines verschachtelten Intents. Wenn eine andere Anwendung das PendingIntent
der darin enthaltenen Intent
entpackt, kann die andere Anwendung die PendingIntent
anhand der Identität Ihrer Anwendung starten. Mit dieser Konfiguration kann die andere Anwendung jede Komponente, einschließlich einer nicht exportierten Komponente, sicher in Ihrer App starten.
Das Diagramm in Abbildung 2 zeigt, wie das System die Steuerung von Ihrer (Client-)Anwendung an eine andere (Dienst-)Anwendung und wieder zurück an Ihre Anwendung übergibt:
- Ihre App erstellt einen Intent, der eine Aktivität in einer anderen App aufruft. Innerhalb dieses Intents fügen Sie als zusätzliches Objekt ein
PendingIntent
-Objekt hinzu. Dieser ausstehende Intent ruft eine Komponente in Ihrer App auf. Diese Komponente wird nicht exportiert. - Beim Empfang des Intents Ihrer Anwendung extrahiert die andere Anwendung das verschachtelte
PendingIntent
-Objekt. - Die andere App ruft die Methode
send()
für dasPendingIntent
-Objekt auf. - Nachdem die Steuerung wieder an die Anwendung übergeben wurde, ruft das System den ausstehenden Intent mithilfe des Kontexts Ihrer Anwendung auf.
Abbildung 2: Diagramm der anwendungsübergreifenden Kommunikation bei Verwendung eines verschachtelten ausstehenden Intents.
Impliziten Intent empfangen
Um anzugeben, welche impliziten Intents Ihre App erhalten kann, deklarieren Sie für jede Ihrer App-Komponenten einen oder mehrere Intent-Filter mit einem <intent-filter>
-Element in Ihrer Manifestdatei.
Jeder Intent-Filter gibt den Typ der Intents an, die er basierend auf der Aktion, den Daten und der Kategorie des Intents akzeptiert. Das System liefert nur dann einen impliziten Intent an Ihre App-Komponente, wenn der Intent einen Ihrer Intent-Filter passieren kann.
Hinweis:Ein expliziter Intent wird immer an sein Ziel gesendet, unabhängig von Intent-Filtern, die die Komponente deklariert.
Eine App-Komponente sollte für jeden einzelnen Job, den sie ausführen kann, separate Filter deklarieren.
Beispiel: Eine Aktivität in einer Bildergalerie-App kann zwei Filter enthalten: einen zum Anzeigen von Bildern und einen zum Bearbeiten eines Bildes. Wenn die Aktivität beginnt, prüft sie das Intent
und entscheidet anhand der Informationen in Intent
, wie sich verhalten soll (z. B. ob die Editor-Steuerelemente angezeigt werden oder nicht).
Jeder Intent-Filter wird durch ein <intent-filter>
-Element in der Manifestdatei der App definiert, das in die entsprechende App-Komponente verschachtelt ist, zum Beispiel ein <activity>
-Element.
Legen Sie in jeder App-Komponente, die ein <intent-filter>
-Element enthält, explizit einen Wert für android:exported
fest.
Dieses Attribut gibt an, ob die App-Komponente für andere Apps zugänglich ist. In einigen Situationen, z. B. bei Aktivitäten, deren Intent-Filter die Kategorie LAUNCHER
enthalten, ist es sinnvoll, dieses Attribut auf true
festzulegen. Andernfalls ist es sicherer, dieses Attribut auf false
festzulegen.
Warnung:Wenn ein Aktivitäts-, Dienst- oder Übertragungsempfänger in Ihrer App Intent-Filter verwendet und den Wert für android:exported
nicht explizit festlegt, kann die App nicht auf Geräten mit Android 12 oder höher installiert werden.
In <intent-filter>
können Sie mit einem oder mehreren der folgenden drei Elemente die Art der zu akzeptierenden Intents angeben:
<action>
- Deklariert, welche Intent-Aktion im Attribut
name
akzeptiert wird. Der Wert muss der literale Stringwert einer Aktion sein, nicht die Klassenkonstante. <data>
- Deklariert den akzeptierten Datentyp mithilfe eines oder mehrerer Attribute, die verschiedene Aspekte des Daten-URI (
scheme
,host
,port
,path
) und des MIME-Typs angeben. <category>
- Definiert die akzeptierte Intent-Kategorie im Attribut
name
. Der Wert muss der literale Stringwert einer Aktion sein, nicht die Klassenkonstante.Hinweis:Damit implizite Intents empfangen werden, müssen Sie die Kategorie
CATEGORY_DEFAULT
in den Intent-Filter aufnehmen. Die MethodenstartActivity()
undstartActivityForResult()
behandeln alle Intents so, als hätten sie die KategorieCATEGORY_DEFAULT
deklariert. Wenn Sie diese Kategorie nicht in Ihrem Intent-Filter deklarieren, werden keine impliziten Intents für Ihre Aktivität aufgelöst.
Hier sehen Sie beispielsweise eine Aktivitätsdeklaration mit einem Intent-Filter, um den Intent ACTION_SEND
zu erhalten, wenn der Datentyp Text ist:
<activity android:name="ShareActivity" android:exported="false"> <intent-filter> <action android:name="android.intent.action.SEND"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeType="text/plain"/> </intent-filter> </activity>
Sie können einen Filter erstellen, der mehr als eine Instanz von <action>
, <data>
oder <category>
enthält.
In diesem Fall müssen Sie sicher sein, dass die Komponente alle Kombinationen dieser Filterelemente verarbeiten kann.
Wenn Sie mehrere Arten von Intents verarbeiten möchten, aber nur in bestimmten Kombinationen aus Aktion, Daten und Kategorietyp, müssen Sie mehrere Intent-Filter erstellen.
Ein impliziter Intent wird anhand eines Filters getestet, indem der Intent mit jedem der drei Elemente verglichen wird. Damit der Intent an die Komponente übermittelt wird, muss er alle drei Tests bestehen. Wenn auch nur eines davon nicht zugeordnet wird, sendet das Android-System den Intent nicht an die Komponente. Da eine Komponente jedoch mehrere Intent-Filter haben kann, kann ein Intent, der einen der Filter einer Komponente nicht durchläuft, auch einen anderen Filter passieren. Weitere Informationen dazu, wie das System Intents auflöst, finden Sie im Abschnitt Intent-Auflösung unten.
Achtung : Die Verwendung eines Intent-Filters ist keine sichere Methode, um zu verhindern, dass Ihre Komponenten von anderen Anwendungen gestartet werden. Obwohl Intent-Filter eine Komponente so einschränken, dass sie nur auf bestimmte Arten von impliziten Intents reagiert, kann eine andere App Ihre App-Komponente möglicherweise mit einem expliziten Intent starten, wenn der Entwickler die Komponentennamen bestimmt.
Deklarieren Sie in Ihrem Manifest keine Intent-Filter, wenn es wichtig ist, dass nur Ihre eigene Anwendung eine Ihrer Komponenten starten kann. Setzen Sie stattdessen für diese Komponente das Attribut exported
auf "false"
.
Ebenso sollten Sie immer einen expliziten Intent verwenden, um Ihren eigenen Dienst zu starten, um zu vermeiden, dass Sie versehentlich das Service
einer anderen Anwendung ausführen.
Hinweis:Für alle Aktivitäten müssen Sie Intent-Filter in der Manifestdatei deklarieren.
Filter für Übertragungsempfänger können jedoch dynamisch registriert werden, indem registerReceiver()
aufgerufen wird. Anschließend können Sie die Registrierung des Empfängers bei unregisterReceiver()
aufheben. So kann Ihre App nur während eines bestimmten Zeitraums auf bestimmte Broadcasts warten, während sie ausgeführt wird.
Beispielfilter
Im Folgenden finden Sie ein Beispiel aus der Manifestdatei einer App zum Teilen von Inhalten, um einige der Funktionsweisen von Intent-Filtern zu veranschaulichen:
<activity android:name="MainActivity" android:exported="true"> <!-- This activity is the main entry, should appear in app launcher --> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name="ShareActivity" android:exported="false"> <!-- This activity handles "SEND" actions with text data --> <intent-filter> <action android:name="android.intent.action.SEND"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeType="text/plain"/> </intent-filter> <!-- This activity also handles "SEND" and "SEND_MULTIPLE" with media data --> <intent-filter> <action android:name="android.intent.action.SEND"/> <action android:name="android.intent.action.SEND_MULTIPLE"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeType="application/vnd.google.panorama360+jpg"/> <data android:mimeType="image/*"/> <data android:mimeType="video/*"/> </intent-filter> </activity>
Die erste Aktivität (MainActivity
) ist der Haupteinstiegspunkt der App – die Aktivität, die geöffnet wird, wenn der Nutzer die App zum ersten Mal mit dem Launcher-Symbol startet:
- Die Aktion
ACTION_MAIN
gibt an, dass dies der Haupteinstiegspunkt ist und erwartet keine Intent-Daten. - Die Kategorie
CATEGORY_LAUNCHER
gibt an, dass das Symbol dieser Aktivität im App Launcher des Systems platziert werden soll. Wenn im Element<activity>
kein Symbol miticon
angegeben ist, verwendet das System das Symbol aus dem Element<application>
.
Beide Geräte müssen miteinander gekoppelt sein, damit die Aktivität im App Launcher angezeigt wird.
Die zweite Aktivität, ShareActivity
, dient dazu, das Teilen von Text- und Medieninhalten zu erleichtern. Nutzer geben diese Aktivität zwar über MainActivity
ein, aber sie können ShareActivity
auch direkt aus einer anderen App eingeben, die einen impliziten Intent ausgibt, der mit einem der beiden Intent-Filter übereinstimmt.
Hinweis:Der MIME-Typ application/vnd.google.panorama360+jpg
ist ein spezieller Datentyp zur Angabe von Panoramafotos. Sie können sie mit den Google Panorama APIs verarbeiten.
Intents mit Intent-Filtern anderer Apps abgleichen
Wenn eine andere App auf Android 13 (API-Level 33) oder höher ausgerichtet ist, kann sie den Intent Ihrer App nur dann verarbeiten, wenn der Intent mit den Aktionen und Kategorien eines <intent-filter>
-Elements in dieser anderen App übereinstimmt. Findet das System keine Übereinstimmung, wird ein ActivityNotFoundException
ausgelöst.
Die sendende App muss diese Ausnahme verarbeiten.
Wenn du deine App so aktualisierst, dass sie auf Android 13 oder höher ausgerichtet ist, werden alle Intents von externen Apps nur dann an eine exportierte Komponente deiner App gesendet, wenn der Intent mit den Aktionen und Kategorien eines <intent-filter>
-Elements übereinstimmt, das deine App deklariert. Dieses Verhalten tritt unabhängig von der SDK-Zielversion der sendenden App auf.
In den folgenden Fällen wird der Intent-Abgleich nicht erzwungen:
- Intents, die an Komponenten gesendet werden, die keine Intent-Filter deklarieren.
- Intents, die aus derselben App stammen.
- Intents, die aus dem System stammen, d. h. Intents, die von der "System-UID" (uid=1000) gesendet werden. Zu den System-Apps gehören
system_server
und Apps, bei denenandroid:sharedUserId
aufandroid.uid.system
festgelegt wurde. - Intents, die von der Root-Instanz stammen.
Weitere Informationen zum Intent-Abgleich
Ausstehenden Intent verwenden
Ein PendingIntent
-Objekt ist ein Wrapper um ein Intent
-Objekt. Der Hauptzweck eines PendingIntent
besteht darin, einer fremden Anwendung die Berechtigung zu erteilen, das enthaltene Intent
so zu verwenden, als wäre es aus dem eigenen Prozess der Anwendung ausgeführt worden.
Wichtige Anwendungsfälle für ausstehende Intents:
- Sie deklarieren einen Intent, der ausgeführt werden soll, wenn der Nutzer eine Aktion mit Ihrer Benachrichtigung ausführt. Das
NotificationManager
des Android-Systems führt dasIntent
aus. - Sie deklarieren einen Intent, der ausgeführt werden soll, wenn der Nutzer eine Aktion mit Ihrem App-Widget ausführt. Die Startbildschirm-App führt
Intent
aus. - Deklarieren eines Intents, der zu einem bestimmten Zeitpunkt in der Zukunft ausgeführt werden soll (der
AlarmManager
des Android-Systems führt dasIntent
aus).
Genauso, wie jedes Intent
-Objekt von einer bestimmten Art von App-Komponente verarbeitet werden soll (entweder einem Activity
-, einem Service
- oder einem BroadcastReceiver
), muss auch ein PendingIntent
-Objekt mit der gleichen Überlegung erstellt werden. Bei Verwendung eines ausstehenden Intents führt Ihre App den Intent nicht mit einem Aufruf wie startActivity()
aus. Stattdessen müssen Sie den gewünschten Komponententyp beim Erstellen von PendingIntent
durch Aufrufen der entsprechenden Creator-Methode deklarieren:
PendingIntent.getActivity()
für einIntent
, das einActivity
startet.PendingIntent.getService()
für einIntent
, das einenService
startet.PendingIntent.getBroadcast()
für einIntent
, das einenBroadcastReceiver
startet.
Sofern Ihre Anwendung keine ausstehenden Intents von anderen Anwendungen empfängt, sind die oben genannten Methoden zum Erstellen einer PendingIntent
wahrscheinlich die einzigen PendingIntent
-Methoden, die Sie jemals benötigen werden.
Jede Methode verwendet die aktuelle Context
der Anwendung, das Intent
, das Sie umschließen möchten, sowie ein oder mehrere Flags, die angeben, wie der Intent verwendet werden soll, z. B. ob der Intent mehr als einmal verwendet werden kann.
Weitere Informationen zur Verwendung ausstehender Intents finden Sie in der Dokumentation der einzelnen Anwendungsfälle, z. B. in den API-Leitfäden für Notifications und App Widgets.
Veränderlichkeit angeben
Wenn deine App auf Android 12 oder höher ausgerichtet ist, musst du die Veränderlichkeit aller PendingIntent
-Objekte angeben, die von deiner App erstellt werden. Um anzugeben, dass ein bestimmtes PendingIntent
-Objekt änderbar oder unveränderlich ist, verwenden Sie das Flag PendingIntent.FLAG_MUTABLE
bzw. PendingIntent.FLAG_IMMUTABLE
.
Wenn Ihre App versucht, ein PendingIntent
-Objekt zu erstellen, ohne eines der Veränderlichkeits-Flags festzulegen, gibt das System einen IllegalArgumentException
aus und die folgende Meldung wird in Logcat angezeigt:
PACKAGE_NAME: Targeting S+ (version 31 and above) requires that one of \
FLAG_IMMUTABLE or FLAG_MUTABLE be specified when creating a PendingIntent.
Strongly consider using FLAG_IMMUTABLE, only use FLAG_MUTABLE if \
some functionality depends on the PendingIntent being mutable, e.g. if \
it needs to be used with inline replies or bubbles.
Nach Möglichkeit unveränderliche ausstehende Intents erstellen
In den meisten Fällen sollte Ihre Anwendung unveränderliche PendingIntent
-Objekte erstellen, wie im folgenden Code-Snippet gezeigt. Wenn ein PendingIntent
-Objekt unveränderlich ist, können andere Apps den Intent nicht ändern, um das Ergebnis des Aufrufs des Intents anzupassen.
Kotlin
val pendingIntent = PendingIntent.getActivity(applicationContext, REQUEST_CODE, intent, /* flags */ PendingIntent.FLAG_IMMUTABLE)
Java
PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), REQUEST_CODE, intent, /* flags */ PendingIntent.FLAG_IMMUTABLE);
In bestimmten Anwendungsfällen sind stattdessen änderbare PendingIntent
-Objekte erforderlich:
- Unterstützung von Direktantworten in Benachrichtigungen Für die direkte Antwort müssen die Clipdaten im mit der Antwort verknüpften PendingIntent-Objekt geändert werden. Normalerweise fordern Sie diese Änderung an, indem Sie
FILL_IN_CLIP_DATA
als Flag an die MethodefillIn()
übergeben. - Benachrichtigungen werden mithilfe von
CarAppExtender
-Instanzen mit dem Android Auto-Framework verknüpft. - Unterhaltungen mithilfe von Instanzen von
PendingIntent
in Bubbles platzieren. Mit einem änderbarenPendingIntent
-Objekt kann das System die richtigen Flags wieFLAG_ACTIVITY_MULTIPLE_TASK
undFLAG_ACTIVITY_NEW_DOCUMENT
anwenden. - Informationen zum Gerätestandort durch Aufrufen von
requestLocationUpdates()
oder ähnlichen APIs anfordern Mit dem änderbarenPendingIntent
-Objekt kann das System Intent-Extras hinzufügen, die Standortlebenszyklusereignisse darstellen. Zu diesen Ereignissen gehören eine Standortänderung und die Verfügbarkeit eines Anbieters. - Wecker werden mit
AlarmManager
gestellt. Mit dem änderbarenPendingIntent
-Objekt kann das System den IntentEXTRA_ALARM_COUNT
hinzufügen. Dieses Extra gibt an, wie oft ein sich wiederholender Wecker ausgelöst wurde. Dadurch kann der Intent einer App genau mitteilen, ob ein wiederkehrender Alarm mehrmals ausgelöst wurde, z. B. wenn das Gerät im Ruhemodus war.
Wenn Ihre App ein änderbares PendingIntent
-Objekt erstellt, wird dringend empfohlen, einen expliziten Intent zu verwenden und den ComponentName
auszufüllen. Auf diese Weise wird immer dieselbe Komponente in der App gestartet, wenn eine andere App das PendingIntent
aufruft und die Steuerung an die App zurückgibt.
Explizite Intents in ausstehenden Intents verwenden
Damit Sie besser definieren können, wie andere Apps die ausstehenden Intents Ihrer App verwenden können, umschließen Sie einen ausstehenden Intent immer mit einem expliziten Intent. So können Sie diese Best Practice umsetzen:
- Prüfen Sie, ob die Felder für Aktion, Paket und Komponente des Basis-Intents festgelegt sind.
-
Verwenden Sie
FLAG_IMMUTABLE
, das in Android 6.0 (API-Level 23) hinzugefügt wurde, um ausstehende Intents zu erstellen. Dieses Flag verhindert, dass Anwendungen, die einPendingIntent
erhalten, nicht ausgefüllte Attribute ausfüllen. Wenn dieminSdkVersion
deiner App22
oder niedriger ist, kannst du mit dem folgenden Code Sicherheit und Kompatibilität gemeinsam bereitstellen:if (Build.VERSION.SDK_INT >= 23) { // Create a PendingIntent using FLAG_IMMUTABLE. } else { // Existing code that creates a PendingIntent. }
Intent-Auflösung
Wenn das System einen impliziten Intent zum Starten einer Aktivität empfängt, sucht es nach der besten Aktivität für den Intent, indem es diese anhand von drei Aspekten mit Intent-Filtern vergleicht:
- Action.
- Daten (sowohl URI als auch Datentyp).
- Kategorie:
In den folgenden Abschnitten wird beschrieben, wie Intents gemäß der Deklaration des Intent-Filters in der Manifestdatei einer App den entsprechenden Komponenten zugeordnet werden.
Aktionstest
Zum Angeben akzeptierter Intent-Aktionen kann ein Intent-Filter null oder mehr <action>
-Elemente deklarieren, wie im folgenden Beispiel gezeigt:
<intent-filter> <action android:name="android.intent.action.EDIT" /> <action android:name="android.intent.action.VIEW" /> ... </intent-filter>
Damit dieser Filter bestanden wird, muss die in Intent
angegebene Aktion mit einer der im Filter aufgeführten Aktionen übereinstimmen.
Wenn der Filter keine Aktionen auflistet, gibt es für einen Intent keine Übereinstimmungen, sodass alle Intents den Test nicht bestehen. Wenn ein Intent
jedoch keine Aktion angibt, besteht der Test, sofern der Filter mindestens eine Aktion enthält.
Kategorietest
Zum Angeben akzeptierter Intent-Kategorien kann ein Intent-Filter null oder mehr <category>
-Elemente deklarieren, wie im folgenden Beispiel gezeigt:
<intent-filter> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> ... </intent-filter>
Damit ein Intent den Kategorietest besteht, muss jede Kategorie im Intent
einer Kategorie im Filter entsprechen. Umgekehrt ist dies nicht erforderlich – der Intent-Filter kann mehr Kategorien deklarieren, als in Intent
angegeben sind, und der Intent
besteht trotzdem. Daher besteht ein Intent ohne Kategorien immer diesen Test, unabhängig davon, welche Kategorien im Filter deklariert sind.
Hinweis:Android wendet die Kategorie CATEGORY_DEFAULT
automatisch auf alle impliziten Intents an, die an startActivity()
und startActivityForResult()
übergeben werden.
Wenn Ihre Aktivität implizite Intents erhalten soll, muss sie in ihren Intent-Filtern eine Kategorie für "android.intent.category.DEFAULT"
enthalten, wie im vorherigen <intent-filter>
-Beispiel gezeigt.
Datentest
Zur Angabe akzeptierter Intent-Daten kann ein Intent-Filter null oder mehr <data>
-Elemente deklarieren, wie im folgenden Beispiel gezeigt:
<intent-filter> <data android:mimeType="video/mpeg" android:scheme="http" ... /> <data android:mimeType="audio/mpeg" android:scheme="http" ... /> ... </intent-filter>
Für jedes <data>
-Element können eine URI-Struktur und ein Datentyp (MIME-Medientyp) angegeben werden.
Jeder Teil des URI besteht aus einem separaten Attribut: scheme
, host
, port
und path
:
<scheme>://<host>:<port>/<path>
Das folgende Beispiel zeigt mögliche Werte für diese Attribute:
content://com.example.project:200/folder/subfolder/etc
In diesem URI ist das Schema content
, der Host ist com.example.project
, der Port ist 200
und der Pfad folder/subfolder/etc
.
Jedes dieser Attribute ist in einem <data>
-Element optional, es gibt jedoch lineare Abhängigkeiten:
- Wenn kein Schema angegeben ist, wird der Host ignoriert.
- Wenn kein Host angegeben ist, wird der Port ignoriert.
- Wenn weder das Schema noch der Host angegeben sind, wird der Pfad ignoriert.
Beim Vergleich des URI in einem Intent mit einer URI-Spezifikation in einem Filter werden nur die Teile des URI verglichen, die im Filter enthalten sind. Beispiele:
- Wenn ein Filter nur ein Schema angibt, entsprechen alle URIs mit diesem Schema dem Filter.
- Wenn ein Filter ein Schema und eine Autorität, aber keinen Pfad angibt, übergeben alle URIs mit demselben Schema und derselben Autorität den Filter, unabhängig von ihren Pfaden.
- Wenn ein Filter ein Schema, eine Autorität und einen Pfad angibt, übergeben nur URIs mit demselben Schema, derselben Autorität und demselben Pfad den Filter.
Hinweis:Eine Pfadspezifikation kann ein Platzhaltersternchen (*) enthalten, damit der Pfadnamen nur teilweise abgeglichen werden muss.
Beim Datentest werden sowohl der URI als auch der MIME-Typ im Intent mit einem im Filter angegebenen URI und MIME-Typ verglichen. Dazu gelten folgende Regeln:
- Ein Intent, der weder einen URI noch einen MIME-Typ enthält, besteht den Test nur dann, wenn im Filter keine URIs oder MIME-Typen angegeben sind.
- Ein Intent, der einen URI, aber keinen MIME-Typ enthält (weder explizit noch aus dem URI ableitend), besteht den Test nur dann, wenn sein URI dem URI-Format des Filters entspricht und der Filter ebenfalls keinen MIME-Typ angibt.
- Ein Intent, der einen MIME-Typ, aber keinen URI enthält, besteht den Test nur dann, wenn der Filter denselben MIME-Typ auflistet und kein URI-Format angibt.
- Ein Intent, der sowohl einen URI als auch einen MIME-Typ (entweder explizit oder aus dem URI ableitend) enthält, übergibt den MIME-Typ-Teil des Tests nur, wenn dieser Typ mit einem im Filter aufgeführten Typ übereinstimmt. Der URI-Teil des Tests wird übergeben, wenn sein URI mit einem URI im Filter übereinstimmt oder er einen
content:
- oderfile:
-URI enthält und der Filter keinen URI angibt. Mit anderen Worten: Es wird angenommen, dass eine Komponentecontent:
- undfile:
-Daten unterstützt, wenn der Filter nur einen MIME-Typ auflistet.
Hinweis:Gibt ein Intent einen URI oder MIME-Typ an, schlägt der Datentest fehl, wenn <intent-filter>
keine <data>
-Elemente enthält.
Die letzte Regel, Regel (d), spiegelt die Erwartung wider, dass Komponenten lokale Daten von einer Datei oder einem Contentanbieter abrufen können.
Daher können ihre Filter nur einen Datentyp auflisten und müssen die Schemas content:
und file:
nicht explizit benennen.
Das folgende Beispiel zeigt einen typischen Fall, in dem ein <data>
-Element Android mitteilt, dass die Komponente Bilddaten von einem Contentanbieter abrufen und anzeigen kann:
<intent-filter> <data android:mimeType="image/*" /> ... </intent-filter>
Filter, die einen Datentyp, aber keinen URI angeben, sind möglicherweise am häufigsten, da die meisten verfügbaren Daten von Contentanbietern ausgegeben werden.
Eine weitere gängige Konfiguration ist ein Filter mit einem Schema und einem Datentyp. Ein <data>
-Element wie das folgende zeigt Android beispielsweise an, dass die Komponente zum Ausführen der Aktion Videodaten aus dem Netzwerk abrufen kann:
<intent-filter> <data android:scheme="http" android:mimeType="video/*" /> ... </intent-filter>
Intent-Abgleich
Intents werden mit Intent-Filtern abgeglichen, um nicht nur eine zu aktivierende Zielkomponente zu erkennen, sondern auch etwas über die Gruppe von Komponenten auf dem Gerät. Die Home App füllt beispielsweise den App Launcher, indem sie alle Aktivitäten mit Intent-Filtern findet, die die Aktion ACTION_MAIN
und die Kategorie CATEGORY_LAUNCHER
angeben.
Eine Übereinstimmung ist nur erfolgreich, wenn die Aktionen und Kategorien im Intent mit dem Filter übereinstimmen, wie in der Dokumentation zur Klasse IntentFilter
beschrieben.
Ihre App kann den Intent-Abgleich ähnlich wie die Home App verwenden.
Für PackageManager
gibt es eine Reihe von query...()
-Methoden, die alle Komponenten zurückgeben, die einen bestimmten Intent akzeptieren können, sowie eine Reihe ähnlicher resolve...()
-Methoden, die die beste Komponente für die Antwort auf einen Intent bestimmen. queryIntentActivities()
gibt beispielsweise eine Liste aller Aktivitäten zurück, die den als Argument übergebenen Intent ausführen können, und queryIntentServices()
gibt eine ähnliche Liste von Diensten zurück.
Keine der Methoden aktiviert die Komponenten. Es werden nur die Komponenten aufgelistet, die antworten können. Es gibt eine ähnliche Methode, queryBroadcastReceivers()
, für Sendeempfänger.