Intents und Intent-Filter

Ein Intent ist ein Messaging-Objekt, mit dem Sie eine Aktion von einer anderen App-Komponente anfordern können. Intents erleichtern die Kommunikation zwischen Komponenten auf verschiedene Arten. Es gibt jedoch drei grundlegende Anwendungsfälle:

  • Aktivität starten

    Ein Activity steht für einen einzelnen Bildschirm in einer App. Sie können eine neue Instanz eines Activity durch Übergeben eines Intent an startActivity(). Das Intent beschreibt die zu startende Aktivität und trägt alle notwendigen Daten.

    Wenn Sie nach Abschluss der Aktivität ein Ergebnis erhalten möchten, rufen Sie startActivityForResult() an. Das Ergebnis wird Ihrer Aktivität als separates Intent-Objekt im onActivityResult()-Callback Ihrer Aktivität zugewiesen. 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. Ab Android 5.0 (API-Level 21) können Sie einen Dienst mit JobScheduler starten. Weitere Informationen zu JobScheduler, sieh dir ihre an API-reference documentation.

    Bei Versionen vor Android 5.0 (API-Level 21) können Sie einen Dienst starten, indem Sie der Service-Klasse verwendet. Sie können einen Dienst starten, um einen einmaligen Vorgang auszuführen (z. B. das Herunterladen einer Datei), indem Sie Intent an startService() übergeben. Das Intent beschreibt den zu startenden Dienst und überträgt alle erforderlichen Daten.

    Wenn der Dienst mit einer Client-Server-Schnittstelle konzipiert wurde, können Sie eine Bindung an den Dienst erstellen. von einer anderen Komponente abzurufen, indem Sie ein Intent an bindService() übergeben. Weitere Informationen finden Sie im Leitfaden Dienste.

  • Übertragung starten

    Eine Übertragung ist eine Nachricht, die jede App empfangen kann. Das System sendet verschiedene Broadcasts für Systemereignisse, z. B. wenn das System gestartet wird oder das Gerät geladen wird. Du kannst eine Nachricht an andere Apps senden, indem du ein Intent übergibst. an sendBroadcast() oder sendOrderedBroadcast()

Im weiteren Verlauf dieser Seite wird erläutert, wie Intents funktionieren und wie sie 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 durch Angabe eines vollständigen ComponentName an, welche Komponente welcher Anwendung den Intent erfüllt. Sie werden verwenden in der Regel einen expliziten Intent, um eine Komponente Ihre eigene App verwenden, da Sie den Kursnamen der Aktivität oder des Dienstes kennen, den Sie starten möchten. So können Sie beispielsweise als Reaktion auf eine Nutzeraktion eine neue Aktivität in Ihrer App starten oder einen Dienst zum Herunterladen einer Datei im Hintergrund starten.
  • Implizite Intents benennen keine bestimmten Komponenten, sondern deklarieren eine allgemeine Aktion. sodass eine Komponente aus einer anderen App diese verarbeitet. Wenn Sie beispielsweise einem Nutzer einen Ort auf einer Karte anzeigen möchten, können Sie mit einer impliziten Intent anfordern, dass eine andere geeignete App einen bestimmten Ort auf einer Karte anzeigt.

Abbildung 1 zeigt, wie ein Intent beim Starten einer Aktivität verwendet wird. Wenn der Parameter Intent-Objekt eine bestimmte Aktivitätskomponente explizit angibt, startet diese Komponente sofort.

Abbildung 1: So wird ein impliziter Intent über das System gesendet, um eine andere Aktivität zu starten: [1] Aktivität A erstellt ein Intent mit einer Aktionsbeschreibung und übergibt es an startActivity(). [2] Das Android-System sucht in allen Apps nach einem Intent-Filter, der mit dem Intent übereinstimmt. Wenn eine Übereinstimmung gefunden wird, [3] wird das System startet die Abgleichsaktivität (Aktivität B), indem die zugehörige onCreate()-Methode aufgerufen und die Intent-Methode übergeben wird.

Wenn Sie einen impliziten Intent verwenden, sucht das Android-System nach der entsprechenden Komponente, Dazu wird der Inhalt des Intents mit den Intent-Filtern verglichen, die in der Manifestdatei anderer Apps auf der . Wenn der Intent mit einem Intent-Filter übereinstimmt, startet das System diese Komponente und stellt sie bereit Das Intent-Objekt. Wenn mehrere Intent-Filter kompatibel sind, zeigt ein Dialogfeld an, in dem der Nutzer auswählen kann, welche App er verwenden möchte.

Ein Intent-Filter ist ein Ausdruck in der Manifestdatei einer App, der gibt die Art der Intents an, die Sie erhalten möchten. Wenn Sie z. B. einen Intent-Filter für eine Aktivität deklarieren, ermöglichen Sie es anderen Apps, Ihre Aktivität mit einer bestimmten Absicht direkt zu starten. Wenn Sie für eine Aktivität keine Intent-Filter angeben, kann sie nur mit einer expliziten Absicht gestartet werden.

Achtung: Damit Ihre App sicher ist, sollten Sie beim Starten einer Service immer eine explizite Absicht verwenden und keine Intent-Filter für Ihre Dienste deklarieren. Die Verwendung einer impliziten Absicht zum Starten eines Dienstes stellt ein Sicherheitsrisiko dar, da Sie nicht sicher sein können, welcher Dienst auf die Absicht reagiert, und der Nutzer nicht sehen kann, welcher Dienst gestartet wird. Ab Android 5.0 (API-Level 21) wird das System löst eine Ausnahme aus, wenn Sie bindService() aufrufen mit einer impliziten Absicht.

Intent erstellen

Ein Intent-Objekt enthält Informationen, die das Android-System verwendet. um zu bestimmen, welche Komponente gestartet werden soll (z. B. den genauen Namen der Komponente Kategorie, die den Intent erhalten soll), sowie Informationen, die die Empfängerkomponente in um die Aktion ordnungsgemäß auszuführen (z. B. die auszuführende Aktion und die Daten, auf die sie reagieren sollen).

Die Hauptinformationen in einem Intent sind:

Komponentenname
Der Name der zu startenden Komponente.

Diese Angabe ist optional, aber sie ist die wichtigste Information, die einen Intent explizit macht. Das bedeutet, dass der Intent nur an die App-Komponente gesendet werden sollte, die durch den Komponentennamen definiert ist. Ohne einen Komponentennamen ist der Intent implizit und der entscheidet anhand der anderen Intent-Informationen, welche Komponente den Intent erhalten soll. (Aktion, Daten und Kategorie, wie unten beschrieben). Wenn Sie eine bestimmte Komponente in Ihrer App haben, müssen Sie den Namen der Komponente angeben.

Hinweis: Wenn Sie einen Service starten, Geben Sie immer den Komponentennamen an. Andernfalls können Sie nicht sicher sein, auf den Intent reagiert und der Nutzer nicht sehen kann, welcher Dienst gestartet wird.

Dieses Feld von Intent ist ein ComponentName-Objekt, das Sie mit einem voll qualifizierten Klassennamen der Zielkomponente angeben können, einschließlich des Paketnamens der App, z. B. com.example.ExampleActivity. Sie können den Komponentennamen mit setComponent(), setClass(), setClassName(), oder mit der Intent.

Aktion
Ein String, der die auszuführende allgemeine Aktion angibt, z. B. anzeigen oder auswählen.

Bei einem Broadcast-Intent ist dies die Aktion, die stattgefunden hat und gemeldet wird. Die Aktion bestimmt vor allem, wie der Rest des Intents strukturiert ist, insbesondere die in den Daten und Extras enthaltenen Informationen.

Sie können eigene Aktionen für die Verwendung durch Intents in Ihrer App oder für die Verwendung durch andere Apps zum Aufrufen von Komponenten in Ihrer App angeben. Normalerweise geben Sie jedoch Aktionskonstanten an, die von der Klasse Intent oder anderen Framework-Klassen definiert sind. 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 einem Nutzer in einer Aktivität angezeigt werden können, z. B. ein Foto, das in einer Galerie-App angezeigt werden soll, 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 einige Daten haben, die der Nutzer abrufen kann. über eine andere App teilen, z. B. eine E-Mail-App oder eine App zum Teilen in sozialen Netzwerken.

Weitere Konstanten, die generische Aktionen definieren, finden Sie in der Referenz zur Klasse Intent. Andere Aktionen werden an anderer Stelle im Android-Framework definiert, z. B. in Settings für Aktionen, die bestimmte Bildschirme in den Einstellungen des Systems öffnen.

Sie können die Aktion für einen Intent mit setAction() oder mit einem Intent-Konstruktor angeben.

Wenn Sie eigene Aktionen definieren, geben Sie den Paketnamen Ihrer App als Präfix an, wie im folgenden Beispiel gezeigt:

const val ACTION_TIMETRAVEL = "com.example.action.TIMETRAVEL"
static final String ACTION_TIMETRAVEL = "com.example.action.TIMETRAVEL";
Daten
Der URI (ein Uri-Objekt), der auf die zu verarbeitenden Daten verweist, und/oder der MIME-Typ dieser Daten. Die Art der bereitgestellten Daten wird im Allgemeinen von der Aktion des Intents bestimmt. Wenn die Aktion beispielsweise ACTION_EDIT ist, sollten die Daten die URI des zu bearbeitenden Dokuments enthalten.

Beim Erstellen eines Intents Häufig ist es wichtig, zusätzlich zum URI auch den Datentyp (seinen MIME-Typ) anzugeben. Eine Aktivität, mit der Bilder angezeigt werden können, kann beispielsweise keine Audiodatei abspielen, auch wenn die URI-Formate ähnlich sind. Wenn Sie den MIME-Typ Ihrer Daten angeben, kann das Android-System die beste Komponente zum Empfangen Ihrer Intents finden. Der MIME-Typ kann jedoch manchmal aus dem URI abgeleitet werden, insbesondere wenn es sich bei den Daten um einen content:-URI. Ein content:-URI gibt an, dass sich die Daten auf dem Gerät befinden und von einem ContentProvider verwaltet werden, wodurch der MIME-Typ der Daten für das System sichtbar wird.

Wenn Sie nur den Daten-URI festlegen möchten, rufen Sie setData() auf. Wenn Sie nur den MIME-Typ festlegen möchten, rufen Sie setType() auf. Falls erforderlich, können beide explizit mit setDataAndType() festlegen.

Achtung: Wenn du sowohl den URI als auch den MIME-Typ festlegen möchtest, rufe setData() und setType() nicht auf, da sie den Wert des jeweils anderen aufheben. Verwenden Sie immer setDataAndType(), um sowohl die URI als auch den MIME-Typ festzulegen.

Category
Ein String mit zusätzlichen Informationen zum Komponententyp das den Intent verarbeiten sollte. Einem Intent kann eine beliebige Anzahl von Kategoriebeschreibungen hinzugefügt 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. durch einen Link wie ein Bild oder eine E-Mail-Nachricht referenziert wird.
CATEGORY_LAUNCHER
Die Aktivität ist die erste Aktivität einer Aufgabe und wird im Anwendungs-Launcher des Systems aufgeführt.

In der Beschreibung der Klasse Intent finden Sie eine vollständige Liste der Kategorien.

Sie können mit addCategory() eine Kategorie angeben.

Die oben aufgeführten Eigenschaften (Komponentenname, Aktion, Daten und Kategorie) stellen die die Eigenschaften eines Intents definieren. Anhand dieser Eigenschaften kann das Android-System ermitteln, welche App-Komponente gestartet werden soll. Ein Intent kann jedoch zusätzliche Informationen enthalten, die sich nicht darauf auswirken, wie er in eine App-Komponente aufgelöst wird. Ein Intent kann auch die folgenden Informationen enthalten:

Weitere Funktionen
Schlüssel/Wert-Paare mit zusätzlichen Informationen, die für die Ausführung der angeforderten Aktion erforderlich sind. So wie bei einigen Aktionen bestimmte Arten von Daten-URIs verwendet werden, haben auch einige Aktionen bestimmte Extras.

Sie können zusätzliche Daten mit verschiedenen putExtra()-Methoden hinzufügen. Jede Methode akzeptiert zwei Parameter: den Schlüsselnamen und den Wert. Sie können auch ein Bundle-Objekt mit allen zusätzlichen Daten erstellen und dann die Bundle in der Intent mit putExtras().

Wenn Sie z. B. einen Intent erstellen, um eine E-Mail mit ACTION_SEND können Sie den Empfänger to mit der Methode EXTRA_EMAIL und geben Sie subject mit den EXTRA_SUBJECT-Taste.

Die Klasse Intent gibt viele EXTRA_*-Konstanten an für standardisierte Datentypen. Wenn Sie Ihre eigenen zusätzlichen Schlüssel deklarieren müssen (für Intents, die Ihre App erhält), achten Sie darauf, den Paketnamen der App anzugeben. als Präfix verwenden, wie im folgenden Beispiel gezeigt:

const val EXTRA_GIGAWATTS = "com.example.EXTRA_GIGAWATTS"
static final String EXTRA_GIGAWATTS = "com.example.EXTRA_GIGAWATTS";

Achtung: Verwenden Sie weder Parcelable noch Serializable-Daten beim Senden eines erwarteten Intents eine andere App nutzen können. Wenn eine App versucht, auf Daten in einem Bundle-Objekt zuzugreifen, aber nicht auf die Paket- oder serialisierte Klasse zugreifen können, löst das System den Fehler RuntimeException.

Flags
Flags werden in der Klasse Intent definiert. Sie dienen als Metadaten für die die Nutzerabsicht verstehen. Die Flags können das Android-System anweisen, eine Aktivität zu starten, z. B. welche Aufgabe sollte die Aktivität zu und wie sie nach der Einführung behandelt werden (z. B. ob sie in die Liste der Aktivitäten).

Weitere Informationen finden Sie im Artikel zur Methode setFlags().

Beispiel für eine explizite Absicht

Mit einem expliziten Intent können Sie eine bestimmte App-Komponente starten, z. B. eine bestimmte Aktivität oder einen bestimmten Dienst in Ihrer App. Um einen expliziten Intent zu erstellen, definieren Sie den Komponentennamen für das Intent-Objekt. Alle anderen Intent-Eigenschaften sind optional.

Wenn Sie in Ihrer App beispielsweise einen Dienst namens DownloadService erstellt haben, eine Datei aus dem Web herunterladen möchten, können Sie sie mit dem folgenden Code starten:

// Executed in an Activity, so 'this' is the Context
// 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)
// Executed in an Activity, so 'this' is the Context
// 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);

Das Intent(Context, Class) -Konstruktor die App Context und den Komponente ein Class-Objekt. Daher startet dieser Intent explizit die DownloadService-Klasse in der App.

Weitere Informationen zum Erstellen und Starten eines Dienstes finden Sie im Leitfaden Dienste.

Beispiel für impliziten Intent

Ein impliziter Intent gibt eine Aktion an, die eine beliebige App auf dem Gerät aufrufen kann, die die Aktion ausführen kann. Die Verwendung eines impliziten Intents ist nützlich, wenn Ihre App das bei anderen Apps schon, und Sie möchten, dass der Nutzer die gewünschte App auswählt.

Wenn Sie z. B. Inhalte haben, die der Nutzer mit anderen Personen teilen soll, Intent erstellen mit der Aktion ACTION_SEND und fügen Sie Extras hinzu, um die zu teilenden Inhalte anzugeben. Wenn Sie startActivity() mit dieser Absicht aufrufen, kann der Nutzer eine App auswählen, über die er die Inhalte teilen möchte.

// 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.
}
// 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 (Intent mit der Aktion ACTION_SEND und mit „text/plain“-Daten). Wenn es nur eine App gibt, die die Anfrage verarbeiten kann, wird diese App sofort geöffnet und erhält die Intent-Daten. Wenn keine anderen Apps damit umgehen können, kann Ihre App den ActivityNotFoundException auffangen. Wenn der Intent von mehreren Aktivitäten akzeptiert wird, zeigt ein Dialogfeld wie in Abbildung 2 an, über das der Nutzer die zu verwendende App auswählen kann.

Weitere Informationen zum Starten anderer Apps finden Sie auch im Leitfaden zum Weiterleiten des Nutzers zu einer anderen App.

Abbildung 2. Ein Auswahldialogfeld.

Erzwingen einer App-Auswahl

Wenn mehrere Apps auf Ihren impliziten Intent reagieren, kann der Nutzer auswählen, welche App verwendet werden soll, und diese App als Standardoption für die Aktion festlegen. Die Möglichkeit zur Auswahl einer Standardeinstellung ist hilfreich, wenn Nutzer eine Aktion ausführen, möchte wahrscheinlich jedes Mal dieselbe App verwenden, z. B. beim Öffnen einer Webseite (Nutzer bevorzugen oft nur einen Webbrowser).

Wenn jedoch mehrere Apps auf die Absicht reagieren können und der Nutzer möglicherweise jedes Mal eine andere App verwenden möchte, sollten Sie ausdrücklich ein Auswahldialogfeld anzeigen. Im Auswahldialog 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 die Aktion „Teilen“ mit der ACTION_SEND-Aktion ausführt, möchten Nutzer möglicherweise je nach aktueller Situation die Freigabe über eine andere App vornehmen. Verwenden Sie daher immer das Auswahldialogfeld, wie in Abbildung 2 dargestellt.

Um die Auswahl anzuzeigen, erstellen Sie mit createChooser() eine Intent und übergeben Sie sie an startActivity(), wie im folgenden Beispiel gezeigt. In diesem Beispiel wird ein Dialogfeld mit einer Liste von Apps angezeigt, die auf den Intent reagieren, der an die createChooser()-Methode übergeben wird. Der angegebene Text wird als Dialogtitel verwendet.

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)
}
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);
}

Starts unsicherer Intents erkennen

Ihre App kann Intents starten, um zwischen Komponenten in Ihrer App zu wechseln oder eine Aktion im Namen einer anderen App auszuführen. Zur Verbesserung der Plattformsicherheit bieten Android 12 (API-Level 31) und höher eine Debug-Funktion, die Sie warnt, wenn Ihre App einen unsicheren Start eines Intents ausführt. Ihre App könnte beispielsweise unsicheren Start eines verschachtelten Intents ausführen. in einem anderen Intent als Extraelement.

Wenn Ihre App beide der folgenden Aktionen ausführt, erkennt das System einen unsicheren Intent-Start und es liegt ein Verstoß gegen den StrictMode vor:

  1. Ihre App entpackt einen verschachtelten Intent aus den Extras eines gesendeten Intents.
  2. Ihre App startet sofort eine App-Komponente mit dieser verschachtelten Absicht, indem sie die Absicht an startActivity(), startService() oder bindService() weitergibt.

Weitere Informationen dazu, wie Sie diese Situation erkennen und Änderungen an Ihrer App vornehmen können, Blogpost über Nesting von Android-Geräten Absichten auf Medium.

Nach Einführung unsicherer Intents suchen

Wenn Sie prüfen möchten, ob in Ihrer App unsichere Intent-Ausführungen gestartet werden, rufen Sie detectUnsafeIntentLaunch() auf, wenn Sie VmPolicy konfigurieren, wie im folgenden Code-Snippet gezeigt. Wenn Ihre App einen StrictMode-Verstoß erkennt, sollten Sie die App-Ausführung beenden, um potenziell vertrauliche Daten zu schützen.

fun onCreate() {
    StrictMode.setVmPolicy(VmPolicy.Builder()
        // Other StrictMode checks that you've previously added.
        // ...
        .detectUnsafeIntentLaunch()
        .penaltyLog()
        // Consider also adding penaltyDeath()
        .build())
}
protected void onCreate() {
    StrictMode.setVmPolicy(new VmPolicy.Builder()
        // Other StrictMode checks that you've previously added.
        // ...
        .detectUnsafeIntentLaunch()
        .penaltyLog()
        // Consider also adding penaltyDeath()
        .build());
}

Verantwortlichere Verwendung von Intents

Mit diesen Best Practices können Sie die Wahrscheinlichkeit eines unsicheren Intent-Starts und eines Verstoßes gegen den StrictMode minimieren.

Kopiere nur die wesentlichen Extras in den Intents und führe alle erforderlichen Bereinigungen und Validierungen durch. Ihre App kann die Extras von einer Absicht in eine andere kopieren, die zum Starten einer neuen Komponente verwendet wird. Das passiert, wenn Ihre App putExtras(Intent) oder putExtras(Bundle) aufruft. Wenn Ihre Anwendung einen dieser Vorgänge ausführt, kopieren Sie nur die Extras, die vom empfangenden Komponente erwartet. Wenn der andere Intent (der die Kopie empfängt) eine Komponente startet, die nicht exportiert, bereinigen und überprüfen Sie die Extras, bevor Sie sie in den Intent kopieren, der die Komponente.

Exportieren Sie die Komponenten Ihrer App nicht unnötig. Wenn Sie beispielsweise eine App-Komponente mit einem internen verschachtelten Intent starten möchten, Attribut android:exported der Komponente auf false setzen.

Verwenden Sie PendingIntent anstelle eines verschachtelten Intents. Wenn eine andere Anwendung das PendingIntent-Objekt ihres Pakets zerlegt. enthält, die Intent enthält, kann die andere App PendingIntent über die Identität Ihrer Anwendung. Mit dieser Konfiguration kann die andere App sicher gestartet werden einer beliebigen Komponente, auch einer nicht exportierten Komponente, in Ihrer App.

Das Diagramm in Abbildung 2 zeigt, wie das System die Kontrolle von deinem (Client) übergibt. App zu einer anderen (Dienst-)App und zurück zu Ihrer App:

  1. Ihre Anwendung erstellt einen Intent, der eine Aktivität in einer anderen Anwendung aufruft. Innerhalb von diesem Intent hinzufügen, fügen Sie ein PendingIntent-Objekt als Extra hinzu. Dieses PendingIntent ruft eine Komponente in Ihrer App auf, die nicht exportiert wird.
  2. Nach Empfang des Intents Ihrer App extrahiert die andere App das verschachtelte PendingIntent-Objekt.
  3. Die andere App ruft die send()-Methode auf dem PendingIntent-Objekt auf.
  4. Nachdem die Steuerung an Ihre App zurückgegeben wurde, ruft das System die ausstehende Absicht mit dem Kontext Ihrer App auf.

Abbildung 2. Diagramm der Kommunikation zwischen Apps bei Verwendung einer verschachtelten ausstehenden Nachricht die Nutzerabsicht verstehen.

Impliziten Intent empfangen

Deklariere einen oder mehrere Intent-Filter, um anzugeben, welche impliziten Intents deine App empfangen kann jede Ihrer App-Komponenten mit einem <intent-filter> in Ihrer Manifestdatei. Jeder Intent-Filter gibt die Art der Intents an, die basierend auf der Aktion des Intents akzeptiert werden. Daten und Kategorie. Das System sendet nur dann einen impliziten Intent an Ihre App-Komponente, Intent kann einen Ihrer Intent-Filter passieren.

Hinweis: Eine explizite Absicht wird immer an ihr Ziel gesendet, unabhängig von den Intent-Filtern, die in der Komponente deklariert sind.

Eine App-Komponente sollte separate Filter für jede einzelne Aufgabe angeben, die sie ausführen kann. Zum Beispiel kann eine Aktivität in einer Bildergalerie-App zwei Filter haben: einen Filter zum Ansehen eines Bildes und einen anderen Filter zum Bearbeiten eines Bildes. Wenn die Aktivität beginnt, prüft die Intent und entscheidet anhand der Informationen, wie es sich verhalten soll. in Intent (z. B. ob die Editor-Steuerelemente angezeigt werden sollen oder nicht).

Jeder Intent-Filter wird durch ein <intent-filter>-Element in der Manifestdatei der App definiert, das in der entsprechenden App-Komponente verschachtelt ist (z. B. 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 andere Apps auf die App-Komponente zugreifen können. In einigen Fällen, 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 eine Aktivität, ein Dienst oder eine Übertragung Der Empfänger in Ihrer App verwendet Intent-Filter und legt den Wert nicht explizit fest Für android:exported kann deine App nicht auf Geräten installiert werden, die mit Android 12 oder höher.

Im <intent-filter> können Sie mit einem oder mehreren dieser drei Elemente angeben, welche Art von Intents akzeptiert werden sollen:

<action>
 Definiert im name-Attribut, dass die Intent-Aktion akzeptiert wurde. Der Wert muss der Stringwert einer Aktion sein, nicht die Klassenkonstante.
<data>
Gibt den zulässigen Datentyp mit einem oder mehreren Attributen an, die verschiedene des Daten-URI (scheme, host, port, path) und den MIME-Typ.
<category>
 Definiert die Intent-Kategorie im Attribut name als akzeptiert. Der Wert muss der literale Stringwert einer Aktion sein, nicht die Klassenkonstante.

Hinweis: Wenn Sie implizite Intents erhalten möchten, müssen Sie die Kategorie CATEGORY_DEFAULT in den Intent-Filter aufnehmen. Die Methoden startActivity() und Alle Intents werden von startActivityForResult() behandelt als hätten sie die Kategorie CATEGORY_DEFAULT deklariert. Wenn du diese Kategorie nicht in deinem Intent-Filter angibst, werden keine impliziten Intents zu Ihre Aktivitäten.

Hier ist beispielsweise eine Aktivitätsdeklaration mit einem Intent-Filter, um eine ACTION_SEND-Intent zu empfangen, 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 mehrere Instanzen 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 von Aktion, Daten und Kategorietyp, müssen Sie mehrere Intent-Filter erstellen.

Eine implizite Absicht wird anhand eines Filters getestet, indem die Absicht mit den drei Elementen verglichen wird. Damit der Intent an die Komponente gesendet werden kann, muss er alle drei Tests bestehen. Wenn auch nur eines davon nicht zugeordnet werden kann, liefert das Android-System den Intent nicht an das Komponente. Da eine Komponente jedoch mehrere Intent-Filter haben kann, kann ein Intent, der einen der Filter einer Komponente nicht besteht, möglicherweise durch einen anderen Filter geleitet werden. Weitere Informationen darüber, wie das System Intents auflöst, finden Sie im folgenden Abschnitt zur Intent Resolution.

Achtung: Mit einem Intent-Filter können Sie nicht sicher verhindern, dass andere Apps Ihre Komponenten starten. Obwohl Intent-Filter eine Komponente darauf beschränken, nur auf bestimmte Arten von impliziten Intents zu reagieren, kann eine andere App Ihre App-Komponente möglicherweise mit einem expliziten Intent starten, wenn der Entwickler Ihre Komponentennamen festlegt. Wenn es wichtig ist, dass nur Ihre eigene App eine Ihrer Komponenten starten kann, deklarieren Sie keine Intent-Filter in Ihrem Manifest. Legen Sie stattdessen das Attribut exported für diese Komponente auf "false" fest.

Um zu vermeiden, dass Sie versehentlich den Code einer anderen App ausführen, Service verwenden, verwenden Sie immer einen expliziten Intent, um Ihren eigenen Dienst zu starten.

Hinweis: Sie müssen Ihre Intent-Filter für alle Aktivitäten in der Manifestdatei deklarieren. Filter für Übertragungsempfänger können jedoch dynamisch registriert werden, indem registerReceiver() Anschließend kannst du die Registrierung des Empfängers bei unregisterReceiver() aufheben. Dadurch kann Ihre App um bestimmte Broadcasts nur für einen bestimmten Zeitraum zu hören, während deine App ausgeführt wird.

Beispielfilter

Hier ist ein Beispiel, das einige Verhaltensweisen von Intent-Filtern veranschaulicht. aus der Manifestdatei einer App zum Teilen in sozialen Netzwerken:

<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. Sie wird geöffnet, wenn der Nutzer die App zum ersten Mal über das Launcher-Symbol startet:

  • Die Aktion ACTION_MAIN gibt an, dass dies der Haupteinstiegspunkt ist und keine Intent-Daten erwartet werden.
  • Die Kategorie CATEGORY_LAUNCHER gibt an, dass das Symbol für diese Aktivität im App Launcher des Systems platziert werden sollte. Wenn das Element <activity> kein Symbol mit icon angibt, verwendet das System das Symbol aus <application> -Elements.

Diese beiden müssen zusammengeführt werden, damit die Aktivität im App Launcher angezeigt wird.

Die zweite Aktivität, ShareActivity, soll das Teilen von Text und Medien erleichtern. Inhalte. Nutzer können diese Aktivität zwar starten, indem sie sie von MainActivity aus aufrufen, kann er ShareActivity auch direkt aus einer anderen App eingeben, die eine implizite Intent, der einem der beiden Intent-Filter entspricht.

Hinweis:Der MIME-Typ, application/vnd.google.panorama360+jpg ist ein spezieller Datentyp, mit dem Panoramafotos erstellen und diese mit dem Google panorama.

Intents mit anderen Apps abgleichen Intent-Filter

Wenn eine andere App auf Android 13 (API-Level 33) oder höher ausgerichtet ist, kann sie mit App-Intent nur zu ermitteln, wenn Ihr Intent mit den Aktionen und Kategorien einer <intent-filter>-Element in dieser anderen App. Findet das System keine erhalten Sie eine ActivityNotFoundException Die sendende App muss Ausnahme.

Wenn Sie Ihre App so aktualisieren, dass sie auf Android 13 oder höher ausgerichtet ist, werden alle Intents, die von externen Apps stammen, nur dann an eine exportierte Komponente Ihrer App gesendet, wenn dieser Intent mit den Aktionen und Kategorien eines <intent-filter>-Elements übereinstimmt, das in Ihrer App deklariert ist. Dieses Verhalten tritt unabhängig von der Ziel-SDK-Version der sendenden App auf.

In den folgenden Fällen wird der Intent-Abgleich nicht erzwungen:

  • Intents, die an Komponenten gesendet werden, für die keine Intent-Filter deklariert sind.
  • Intents, die aus derselben App stammen.
  • Vom System stammende Intents, d. h. Intents, die von der „System-UID“ (uid=1000) gesendet werden. Zu den System-Apps gehören system_server und Apps, die android:sharedUserId auf android.uid.system setzen.
  • Intents aus dem Stammverzeichnis.

Weitere Informationen zum Intent-Abgleich

Ausstehende Intents verwenden

Ein PendingIntent-Objekt ist ein Wrapper um ein Intent-Objekt. Der Hauptzweck eines PendingIntent einer fremdsprachigen Anwendung die Erlaubnis um den enthaltenen Intent so zu verwenden, als würde er von Ihrem App-eigenen Prozess zu leiten.

Zu den wichtigsten Anwendungsfällen für einen ausstehenden Intent gehören:

  • Sie deklarieren einen Intent, der ausgeführt werden soll, wenn der Nutzer eine Aktion mit Ihrer Benachrichtigung ausführt. Die NotificationManager des Android-Systems führt dann die Intent aus.
  • Sie deklarieren einen Intent, der ausgeführt werden soll, wenn der Nutzer eine Aktion mit Ihrem App-Widget Die Startbildschirm-App führt den Intent aus.
  • Deklarieren einer Intent-Ausführung zu einem bestimmten zukünftigen Zeitpunkt (AlarmManager des Android-Systems führt die Intent aus).

Genauso wie jedes Intent-Objekt für die Verarbeitung durch eine bestimmte Art von App-Komponente (entweder eine Activity, eine Service oder eine BroadcastReceiver) konzipiert ist, muss auch ein PendingIntent mit derselben Überlegung erstellt werden. Wenn Sie einen ausstehenden Intent verwenden, führt Ihre App den Intent nicht mit einem Aufruf wie startActivity() aus. Stattdessen müssen Sie den gewünschten Komponententyp beim Erstellen der PendingIntent deklarieren, indem Sie die entsprechende Erstellungsmethode aufrufen:

Sofern Ihre App ausstehende Intents von anderen Apps nicht erhält, gilt Folgendes: sind die oben genannten Methoden zur Erstellung PendingIntent wahrscheinlich die einzigen PendingIntent-Methoden, die Sie benötigen.

Jede Methode nimmt die aktuelle App-Context, die Intent, die Sie umschließen möchten, und eine oder mehrere Flags an, die angeben, wie der Intent verwendet werden soll, z. B. ob er mehrmals verwendet werden kann.

Weitere Informationen zur Verwendung ausstehender Intents finden Sie in der Dokumentation zu den jeweiligen Anwendungsfällen, z. B. in den API-Leitfäden für Benachrichtigungen und App-Widgets.

Mutabilität angeben

Wenn deine App auf Android 12 oder höher ausgerichtet ist, musst du die Veränderlichkeit der einzelnen PendingIntent-Objekte, die von Ihrer App erstellt werden. Wenn Sie angeben möchten, dass ein bestimmtes PendingIntent-Objekt verä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 Flags für die Mutabilität festzulegen, löst das System eine IllegalArgumentException aus und in Logcat wird die folgende Meldung 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 App unveränderliche PendingIntent-Objekte erstellen, wie im folgenden Code-Snippet dargestellt. Wenn ein PendingIntent-Objekt unveränderlich ist, können andere Apps die Absicht nicht ändern, um das Ergebnis des Aufrufs der Absicht anzupassen.

val pendingIntent = PendingIntent.getActivity(applicationContext,
        REQUEST_CODE, intent,
        /* flags */ PendingIntent.FLAG_IMMUTABLE)
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 Direct-Response-Aktionen in Benachrichtigungen. Für die direkte Antwort ist eine Änderung der Clipdaten im PendingIntent-Objekt erforderlich, das mit der Antwort verknüpft ist. Normalerweise wird diese Änderung angefordert, indem FILL_IN_CLIP_DATA als Flag an die Methode fillIn() übergeben wird.
  • Benachrichtigungen mit dem Android Auto-Framework verknüpfen, indem Instanzen von CarAppExtender verwendet werden
  • Unterhaltungen mithilfe von Instanzen in Bubbles platzieren von PendingIntent. Mit einem veränderbaren PendingIntent-Objekt kann das System die richtigen Flags anwenden, z. B. FLAG_ACTIVITY_MULTIPLE_TASK und FLAG_ACTIVITY_NEW_DOCUMENT.
  • Standortinformationen des Geräts anfordern, indem requestLocationUpdates() oder ähnliche APIs aufgerufen werden Mit dem änderbaren Objekt PendingIntent kann das System Intent-Extras, die Lebenszyklusereignisse von Standorten darstellen. Dazu gehören z. B. ein Standortwechsel und die Verfügbarkeit eines neuen Anbieters.
  • Wecker mit AlarmManager planen Mit dem änderbaren Objekt PendingIntent kann das System den Parameter EXTRA_ALARM_COUNT zusätzliche Absicht. Diese Zusatzfunktion gibt an, wie oft ein wiederkehrender Wecker ausgelöst wurde. Durch diese zusätzlichen Informationen kann der Intent ob ein sich wiederholender Alarm mehrmals ausgelöst wurde, wie z. B. wenn das Gerät im Ruhemodus war.

Wenn Ihre App ein mutables PendingIntent-Objekt erstellt, sollten Sie unbedingt eine explizite Absicht verwenden und ComponentName ausfüllen. So können Sie immer ruft eine andere App das PendingIntent auf und übergibt die Kontrolle an Ihre App, den immer dieselbe Komponente in Ihrer App.

Explizite Intents in ausstehenden Intents verwenden

Um besser definieren zu können, wie andere Apps die ausstehenden Intents deiner App verwenden können, einen ausstehenden Intent um einen expliziten Intent zusammenzufassen. So können Sie diese Best Practice befolgen:

  1. Prüfen Sie, ob die Felder für Aktion, Paket und Komponente des Basis-Intents vorhanden sind. festgelegt sind.
  2. Verwenden Sie FLAG_IMMUTABLE, das in Android 6.0 (API-Ebene 23) hinzugefügt wurde, um ausstehende Intents zu erstellen. Dieses Flag verhindert, dass Apps, die eine PendingIntent erhalten, das Ausfüllen nicht ausgefüllten Properties. Wenn die minSdkVersion Ihrer App 22 oder niedriger ist, können Sie mit dem folgenden Code für Sicherheit und Kompatibilität sorgen:

    if (Build.VERSION.SDK_INT >= 23) {
      // Create a PendingIntent using FLAG_IMMUTABLE.
    } else {
      // Existing code that creates a PendingIntent.
    }

Auflösung von Absichten

Wenn das System einen impliziten Intent zum Starten einer Aktivität erhält, sucht es nach der besten Aktivität für den Intent. Dazu wird der Intent anhand von drei Aspekten mit Intent-Filtern verglichen:

  • Aktion.
  • Daten (URI und Datentyp)
  • Kategorie:

In den folgenden Abschnitten wird beschrieben, wie Intents gemäß der Intent-Filterdeklaration in der Manifestdatei einer App mit den entsprechenden Komponenten abgeglichen werden.

Test für Aktion

Mit einem Intent-Filter können null oder mehr deklariert werden, um zulässige Intent-Aktionen anzugeben <action>-Elemente, 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, ist für eine Intent zugeordnet, sodass alle Intents den Test nicht bestehen. Wenn für eine Intent jedoch keine Aktion angegeben ist, besteht der Test, sofern der Filter mindestens eine Aktion enthält.

Kategorietest

Um zulässige Intent-Kategorien anzugeben, kann ein Intent-Filter null oder mehr <category>-Elemente angeben, 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 muss mit einer Kategorie im Filter übereinstimmen. Umgekehrt ist das nicht notwendig. Der Intent-Filter kann mehr Kategorien angeben, als in der Intent angegeben sind, und die Intent wird trotzdem zugelassen. Ein Intent ohne Kategorien diesen Test immer besteht, unabhängig von den im Filter deklarierten Kategorien.

Hinweis: Auf Android-Geräten wird die Kategorie CATEGORY_DEFAULT automatisch auf alle impliziten Intents angewendet, die an startActivity() und startActivityForResult() übergeben werden. Wenn Sie möchten, dass Ihre Aktivitäten implizite Intents empfangen, müssen sie eine Kategorie für "android.intent.category.DEFAULT" in seine Intent-Filter einschließen, da wie im vorherigen <intent-filter>-Beispiel gezeigt.

Datentest

Ein Intent-Filter kann null oder mehr deklarieren, um akzeptierte Intent-Daten anzugeben <data>-Elemente, 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>

Jeweils <data> kann eine URI-Struktur und einen Datentyp (MIME-Medientyp) angeben. Jeder Teil des URI ist ein separater 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 ist folder/subfolder/etc.

Jedes dieser Attribute ist in einem <data>-Element optional. aber es gibt lineare Abhängigkeiten:

  • Wenn kein Schema angegeben ist, wird der Host ignoriert.
  • Wenn kein Host angegeben ist, wird der Port ignoriert.
  • Sind weder das Schema noch der Host angegeben, wird der Pfad ignoriert.

Wird der URI in einem Intent mit einer URI-Spezifikation in einem Filter verglichen, nur mit den Teilen des URI verglichen, die im Filter enthalten sind. Beispiel:

  • Wenn in einem Filter nur ein Schema angegeben ist, entsprechen alle URIs mit diesem Schema dem Filter.
  • Wenn in einem Filter ein Schema und eine Autorität, aber kein Pfad angegeben sind, werden alle URIs mit demselben Schema und derselben Autorität unabhängig von ihren Pfaden durch den Filter geleitet.
  • Wenn ein Filter ein Schema, eine Autorität und einen Pfad angibt, werden nur URIs mit demselben Schema, derselben Autorität und demselben Pfad durch den Filter gelassen.

Hinweis:Eine Pfadspezifikation kann ein Platzhaltersternchen (*) enthalten, um nur eine teilweise Übereinstimmung des Pfadnamens erforderlich zu machen.

Beim Datentest werden sowohl der URI als auch der MIME-Typ in der Intent-Anfrage mit einem URI und einem MIME-Typ verglichen, die im Filter angegeben sind. Es gelten die folgenden Regeln:

  1. Ein Intent, der weder einen URI noch einen MIME-Typ enthält, besteht den Test nur, wenn der Filter keine URIs oder MIME-Typen angibt.
  2. Eine Intent-Anfrage, die einen URI, aber keinen MIME-Typ enthält (weder explizit noch aus dem URI ableitbar), besteht den Test nur, wenn ihr URI mit dem URI-Format des Filters übereinstimmt und der Filter ebenfalls keinen MIME-Typ angibt.
  3. Eine Intent-Anfrage, die einen MIME-Typ, aber keinen URI enthält, besteht den Test nur, wenn der Filter denselben MIME-Typ auflistet und kein URI-Format angibt.
  4. Eine Intent-Anfrage, die sowohl einen URI als auch einen MIME-Typ enthält (entweder explizit oder aus dem URI ableitbar), besteht den Teil des Tests für den MIME-Typ nur, wenn dieser Typ mit einem im Filter aufgeführten Typ übereinstimmt. Der URI-Teil des Tests wird entweder übergeben, wenn sein URI mit einem URI im Filter übereinstimmt, oder wenn er einen content:- oder file:-URI hat und im Filter kein URI angegeben ist. Mit anderen Worten: Es wird davon ausgegangen, dass eine Komponente content:- und file:-Daten unterstützt, wenn In der Filterliste wird nur ein MIME-Typ aufgeführt.

Hinweis: Wenn in einer Intent-Definition ein URI oder MIME-Typ angegeben ist, schlägt der Datentest fehl, wenn die <intent-filter> keine <data>-Elemente enthält.

Diese letzte Regel (d) spiegelt die Erwartung wider, dass Komponenten lokale Daten von einem Datei- oder Inhaltsanbieter abrufen können. Daher können ihre Filter nur einen Datentyp enthalten und die content:- und file:-Schemata müssen nicht explizit genannt werden. Das folgende Beispiel zeigt einen typischen Fall, in dem ein <data>-Element teilen Android mit, dass die Komponente Bilddaten aus einem Inhalt abrufen kann und zeigen Sie es an:

<intent-filter>
    <data android:mimeType="image/*" />
    ...
</intent-filter>

Filter, die einen Datentyp, aber keinen URI angeben, sind wahrscheinlich die gängigsten, da die meisten verfügbaren Daten von Contentanbietern bereitgestellt werden.

Eine weitere gängige Konfiguration ist ein Filter mit einem Schema und einem Datentyp. Für Beispiel: <data> wie das Folgende teilen Android mit, kann die Komponente Videodaten aus dem Netzwerk abrufen, um die Aktion auszuführen:

<intent-filter>
    <data android:scheme="http" android:mimeType="video/*" />
    ...
</intent-filter>

Intent-Abgleich

Intents werden nicht nur mit Intent-Filtern abgeglichen, um ein Ziel zu erkennen zu aktivieren, sondern auch, um mehr über die Komponenten des Geräts. Die Home App füllt beispielsweise den App Launcher. indem Sie alle Aktivitäten mit Intent-Filtern ermitteln, die den ACTION_MAIN Aktion und Kategorie CATEGORY_LAUNCHER. Eine Übereinstimmung ist nur erfolgreich, wenn die Aktionen und Kategorien im Intent übereinstimmen. für den Filter, wie in der Dokumentation für IntentFilter beschrieben .

Ihre App kann den Intent-Abgleich auf ähnliche Weise wie die Home App verwenden. Der PackageManager hat eine Reihe von query...()-Methoden, die alle Komponenten zurückgeben, die einen bestimmten Intent akzeptieren können, und eine ähnliche Reihe von resolve...()-Methoden, die die beste Komponente für die Beantwortung eines Intents ermitteln. Beispiel: queryIntentActivities() gibt eine Liste aller Aktivitäten zurück, die ausgeführt werden können. den als Argument übergebenen Intent und queryIntentServices() gibt eine ähnliche Liste von Diensten zurück. Mit keiner der beiden Methoden werden die Komponenten aktiviert. Es werden nur die Komponenten aufgelistet, die antworten können. Für Übertragungsempfänger gibt es eine ähnliche Methode, queryBroadcastReceivers().