Ein Intent
ist ein Nachrichtenobjekt, mit dem Sie eine Aktion anfordern können
aus einer anderen App-Komponente.
Obwohl Intents die Kommunikation zwischen Komponenten auf verschiedene Weise 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
durch Übergeben einesIntent
anstartActivity()
. DasIntent
beschreibt die zu startende Aktivität und trägt alle notwendigen Daten.Wenn Sie nach Abschluss der Aktivität ein Ergebnis erhalten möchten,
startActivityForResult()
anrufen. Deine Aktivität erhält das Ergebnis als separatesIntent
-Objekt imonActivityResult()
-Callback deiner Aktivität. Weitere Informationen finden Sie im Leitfaden zu Aktivitäten. - Dienst starten
Eine
Service
ist eine Komponente, die Vorgänge im Hintergrund ausführt ohne Benutzeroberfläche. Mit Android 5.0 (API-Level 21) und höher können Sie einen Dienst mitJobScheduler
. Weitere Informationen zuJobScheduler
, sieh dir ihre anAPI-reference documentation
.Bei Versionen vor Android 5.0 (API-Level 21) können Sie einen Dienst starten, indem Sie der
Service
-Klasse. Sie können einen Dienst starten, um einen einmaligen Vorgang auszuführen (z. B. das Herunterladen einer Datei), indem SieIntent
anstartService()
übergeben. DasIntent
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
anbindService()
übergeben. Weitere Informationen finden Sie im Leitfaden Dienste. - Broadcasts senden
Eine Nachricht, die jede App empfangen kann. Das System liefert verschiedene bei Systemereignissen wie dem Hochfahren des Systems oder dem Aufladen des Geräts gesendet. Du kannst eine Nachricht an andere Apps senden, indem du ein
Intent
übergibst. ansendBroadcast()
odersendOrderedBroadcast()
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 Teilen von Inhalten.
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 zum Beispiel wenn Sie dem Nutzer einen Standort auf einer Karte zeigen, können Sie mit einem impliziten Intent anfordern, dass eine andere App einen bestimmten Standort auf einer Karte anzeigen.
In Abbildung 1 sehen Sie, 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.
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 die Absicht mit einem Intent-Filter übereinstimmt, startet das System diese Komponente und übergibt ihr das Intent
-Objekt. Wenn mehrere Intent-Filter kompatibel sind, wird ein Dialogfeld angezeigt, in dem der Nutzer auswählen kann, welche App verwendet werden soll.
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. Ebenso kann die Aktivität gestartet werden, wenn Sie keine Intent-Filter für eine Aktivität deklarieren nur mit einer expliziten Absicht.
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 eines impliziten Intents zum Starten eines Dienstes
Sicherheitsrisiko, da Sie nicht sicher sind,
welcher Dienst auf den Intent reagiert,
und der Nutzer kann nicht sehen,
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:
- Name der Komponente
- Der Name der Komponente, die gestartet werden soll.
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 starten möchten, sollten Sie den Komponentennamen 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 einComponentName
-Objekt, das Sie mit einem den qualifizierten Klassennamen der Zielkomponente, einschließlich des Paketnamens der App, z. B.com.example.ExampleActivity
Sie können den Komponentennamen mitsetComponent()
,setClass()
,setClassName()
, oder mit derIntent
. - Aktion
- Ein String, der die auszuführende allgemeine Aktion angibt (z. B. view oder pick).
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 Ihre eigenen Aktionen für Intents in Ihrer App (oder für andere Aktionen) angeben Apps zum Aufrufen von Komponenten in Ihrer App), geben Sie normalerweise aber Aktionskonstanten an definiert durch die Klasse
Intent
oder andere Framework-Klassen. Hier sind einige Häufige Aktionen zum Starten einer Aktivität:ACTION_VIEW
- Verwenden Sie diese Aktion in einem Intent mit
startActivity()
, wenn Sie einige Informationen haben, die kann eine Aktivität dem Nutzer angezeigt werden, z. B. ein Foto, das in einer Galerie-App angezeigt werden soll, oder eine Adresse, in einer Karten-App ansehen. 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 Informationen finden Sie in der
Intent
-Klassenreferenz. Konstanten, die generische Aktionen definieren. Andere Aktionen sind definiert an anderer Stelle im Android-Framework, z. B. inSettings
für Aktionen zum Öffnen bestimmter Bildschirme in den Einstellungen des Systems.Sie können die Aktion für einen Intent mit
setAction()
oder mit einemIntent
-Konstruktor angeben.Wenn du eigene Aktionen definierst, musst du den Paketnamen deiner App angeben als Präfix verwenden, wie im folgenden Beispiel gezeigt:
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 Daten verweist und/oder MIME-Typ dieser Daten. Die Art der bereitgestellten Daten wird im Allgemeinen von der Aktion des Intents bestimmt. Für Lautet die Aktion beispielsweiseACTION_EDIT
, sollten die Daten den Parameter URI des Dokuments, das bearbeitet werden soll.Beim Erstellen eines Intents Häufig ist es wichtig, zusätzlich zum URI auch den Datentyp (seinen MIME-Typ) anzugeben. Beispielsweise kann eine Aktivität, bei der Bilder angezeigt werden können, wahrscheinlich nicht um eine Audiodatei wiederzugeben, auch wenn die URI-Formate ähnlich sein können. Die Angabe des MIME-Typs hilft dem Android um die beste Komponente für Ihre Absicht zu finden. Der MIME-Typ kann jedoch manchmal aus dem URI abgeleitet werden, insbesondere wenn es sich bei den Daten um einen
content:
-URI. Eincontent:
-URI gibt an, dass sich die Daten auf dem Gerät befinden. und gesteuert von einerContentProvider
: Damit wird der Daten-MIME-Typ für das System sichtbar.Wenn Sie nur den Daten-URI festlegen möchten, rufen Sie
setData()
auf. Um nur den MIME-Typ festzulegen, rufen SiesetType()
auf. Falls erforderlich, können Sie beides mitsetDataAndType()
explizit festlegen.Achtung:Wenn Sie sowohl den URI als auch den MIME-Typ festlegen möchten,
setData()
nicht anrufen undsetType()
, da sie jeweils den Wert des anderen auf null setzen. ImmersetDataAndType()
verwenden, um beides festzulegen URI und MIME-Typ. - Category
- Ein String mit zusätzlichen Informationen zur Art der Komponente, die die Absicht verarbeiten soll. Beliebig viele Kategoriebeschreibungen
in einem Intent platziert werden. Für die meisten Intents ist jedoch keine Kategorie erforderlich.
Häufige 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 aufgeführt in App Launcher des Systems.
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 (Name der Komponente, Aktion, Daten und Kategorie) sind die Merkmale, die eine Absicht definieren. Anhand dieser Eigenschaften kann das Android-System welche App-Komponente eingeschaltet werden soll. Ein Intent kann jedoch zusätzliche Informationen, die sich nicht wie er in eine App-Komponente aufgelöst wird. Ein Intent kann auch die folgenden Informationen bereitstellen:
- 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, jeweils zwei Parameter akzeptiert: den Schlüsselnamen und den Wert. Sie können auch einBundle
-Objekt mit allen zusätzlichen Daten erstellen und dann dieBundle
in derIntent
mitputExtras()
.Wenn Sie z. B. einen Intent erstellen, um eine E-Mail mit
ACTION_SEND
können Sie den Empfänger to mit der MethodeEXTRA_EMAIL
und geben Sie subject mit denEXTRA_SUBJECT
-Taste.Die Klasse
Intent
gibt vieleEXTRA_*
-Konstanten für standardisierte Datentypen an. 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:Kotlin
const val EXTRA_GIGAWATTS = "com.example.EXTRA_GIGAWATTS"
Java
static final String EXTRA_GIGAWATTS = "com.example.EXTRA_GIGAWATTS";
Achtung: Verwenden Sie weder
Parcelable
nochSerializable
-Daten beim Senden eines erwarteten Intents eine andere App nutzen können. Wenn eine App versucht, auf Daten in einemBundle
-Objekt zuzugreifen, aber nicht auf die Paket- oder serialisierte Klasse zugreifen können, löst das System den FehlerRuntimeException
. - Meldungen
- Flags werden in der Klasse
Intent
definiert. Sie dienen als Metadaten für 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 in der
setFlags()
-Methode.
Beispiel für einen expliziten Intent
Ein expliziter Intent ist ein Intent, mit dem 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 optional sind.
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:
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);
Das Intent(Context, Class)
-Konstruktor die App Context
und den
Komponente ein Class
-Objekt. Daher
Dieser Intent startet explizit die Klasse DownloadService
in der App.
Weitere Informationen zum Erstellen und Starten eines Dienstes finden Sie unter Dienstübersicht.
Beispiel für einen impliziten Intent
Ein impliziter Intent gibt eine Aktion an, mit der jede App auf dem Gerät aufgerufen werden kann, um die Aktion auszuführen. 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 du anrufst
startActivity()
mit diesem Intent kann der Nutzer
eine App zum Teilen der Inhalte auswählen.
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 alle installierten Apps, um festzustellen, welche diese Art von Intention verarbeiten können.
Intent mit der Aktion ACTION_SEND
und enthält "Text/Nur-Text".
Daten). Gibt es dafür nur eine App, öffnet sich diese sofort und erhält
Nutzerabsicht verstehen. Wenn keine andere App dies unterstützt, kann Ihre App den Fehlercode
ActivityNotFoundException
auftreten können. 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 findest du in der Anleitung. wie Sie den Nutzer eine andere App.
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 Intention reagieren können und der Nutzer möglicherweise eine andere App verwenden möchte
müssen Sie explizit ein Auswahldialogfeld anzeigen. Im Auswahldialog werden Sie gefragt,
Nutzende auswählen, welche App für die Aktion verwendet werden soll. Sie können keine Standard-App für
Aktion). Wenn Ihre App beispielsweise mit der Aktion ACTION_SEND
können Nutzer Inhalte über eine andere App teilen, je nachdem,
je nach Situation, daher sollten Sie immer das Auswahldialogfeld verwenden, 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 an die Methode createChooser()
übergebenen Intent reagieren und den bereitgestellten Text als den
Dialogtitel.
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); }
Gefährliche Intent-Ausführungen erkennen
Ihre App kann Intents starten, um zwischen Komponenten innerhalb der App zu wechseln. oder eine Aktion im Namen einer anderen App durchzuführen. Um die Plattformsicherheit zu verbessern, Android 12 (API-Level 31) und höher bieten eine Debugging-Funktion, die dich warnt wenn ein Intent in Ihrer App nicht sicher gestartet wird. Ihre App könnte beispielsweise unsicheren Start eines verschachtelten Intents ausführen. in einem anderen Intent als Extraelement.
Wenn Ihre App die beiden folgenden Aktionen ausführt, erkennt das System eine unsichere Intent-Start und ein Verstoß StrictMode tritt auf:
- Ihre Anwendung trennt einen verschachtelten Intent von den Extras eines übermittelten Intents.
- Ihre App startet sofort eine App
Komponente mit diesem verschachtelten Intent,
z. B. den Intent an eine andere
startActivity()
,startService()
, oderbindService()
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
Um zu prüfen, ob unsichere Intent-Starts in deiner App gestartet werden, rufe Folgendes auf:
detectUnsafeIntentLaunch()
wenn Sie VmPolicy
konfigurieren, wie im folgenden Code-Snippet gezeigt. Wenn
erkennt Ihre App einen Verstoß im Modus "StrictMode",
sollten Sie die Ausführung der Anwendung beenden,
potenziell vertrauliche Daten 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 verantwortungsbewusster verwenden
Um das Risiko des Starts eines unsicheren Intents und eines StrictMode-Verstoßes zu minimieren, befolgen Sie diese Best Practices.
Kopieren Sie nur die wesentlichen Extras innerhalb der Intents und führen Sie alle erforderlichen
Hygienemaßnahmen und Validierung. Ihre App kann die Extras von einem Intent in
einen anderen Intent, mit dem
eine neue Komponente gestartet wird. Das passiert, wenn Ihre
App-Anrufe
putExtras(Intent)
oder
putExtras(Bundle)
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 App 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 Steuerung von Ihrer (Client-)App an eine andere (Dienst-)App und zurück an Ihre App weitergibt:
- Ihre App erstellt einen Intent, der eine Aktivität in einer anderen App aufruft. In diesem Intent fügen Sie ein
PendingIntent
-Objekt als Extra hinzu. Dieser ausstehende Intent eine Komponente in Ihrer Anwendung aufruft; wird diese Komponente nicht exportiert. - Nach Empfang des Intents Ihrer App extrahiert die andere App das verschachtelte
PendingIntent
-Objekt. - Die andere App ruft die Methode
send()
für dasPendingIntent
-Objekt auf. - Nachdem die Steuerung zurück an die App übergeben wurde, ruft das System die ausstehende mit dem Kontext Ihrer App.
Abbildung 2: Diagramm der App-zu-App-Kommunikation bei Verwendung eines verschachtelten ausstehenden Intents
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 an, welche Arten von Intents basierend auf der Aktion, den Daten und der Kategorie des Intents akzeptiert werden. Das System sendet eine implizite Absicht nur dann an Ihre App-Komponente, wenn die Absicht einen Ihrer Intent-Filter passieren kann.
Hinweis:Ein expliziter Intent wird immer an sein Ziel gesendet. unabhängig von den Intent-Filtern, die die Komponente deklariert.
Eine App-Komponente sollte für jeden einzelnen Job, den sie ausführen kann, separate Filter deklarieren.
Eine Aktivität in einer Bildergalerie-App kann beispielsweise zwei Filter haben: einen Filter
um ein Bild anzuzeigen, und einen weiteren Filter, um ein Bild zu bearbeiten. Zu Beginn der Aktivität wird die Intent
geprüft und anhand der Informationen in der Intent
wird entschieden, wie sich die App verhalten soll, z. B. ob die Steuerelemente des Editors angezeigt werden sollen oder nicht.
Jeder Intent-Filter wird durch einen <intent-filter>
definiert
in der Manifest-Datei der App, verschachtelt in der entsprechenden App-Komponente (z. B.
als <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 ein Übertragungsempfänger in Ihrer App Intent-Filter verwendet und der Wert für android:exported
nicht explizit festgelegt ist, kann Ihre App nicht auf einem Gerät mit Android 12 oder höher installiert werden.
Im <intent-filter>
können Sie mit einem oder mehreren
dieser drei Elemente:
<action>
- Gibt die akzeptierte Intent-Aktion im Attribut
name
an. Der Wert muss der literale 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>
- Gibt im Attribut
name
die akzeptierte Intent-Kategorie an. Der Wert muss der literale Stringwert einer Aktion sein, nicht die Klassenkonstante.Hinweis:Um implizite Intents zu empfangen, müssen Sie muss Folgendes enthalten: Kategorie
CATEGORY_DEFAULT
im Intent-Filter. Bei den MethodenstartActivity()
undstartActivityForResult()
werden alle Intents so behandelt, als wäre die KategorieCATEGORY_DEFAULT
deklariert. Wenn du diese Kategorie nicht in deinem Intent-Filter angibst, werden keine impliziten Intents zu Ihre Aktivitäten.
Hier sehen Sie als Beispiel eine Aktivitätsdeklaration mit einem Intent-Filter, um eine
ACTION_SEND
, 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>
In diesem Fall müssen Sie sicher sein, dass die Komponente alle
Kombinationen dieser Filterelemente.
Wenn Sie mehrere Arten von Intents verarbeiten möchten, jedoch nur in bestimmten Kombinationen Aktion, Daten und Kategorietyp haben, müssen Sie mehrere Intent-Filter erstellen.
Ein impliziter Intent wird anhand eines Filters geprüft, indem der Intent mit jedem der drei Elemente. Damit der Intent an die Komponente übergeben 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, ist ein Intent, der keine oder einer der Filter einer Komponente nicht durchgehen, wird sie möglicherweise bei einem anderen Filter angewendet. Weitere Informationen dazu, wie das System Intents auflöst, finden Sie unten im Abschnitt Intent-Auflösung.
Achtung: Mit einem Intent-Filter können Sie nicht sicher verhindern, dass andere Apps Ihre Komponenten starten. Intent-Filter beschränken zwar, dass eine Komponente nur auf
bestimmte Arten von impliziten Intents, kann eine andere App
Ihre App-Komponente möglicherweise starten,
indem Sie einen expliziten Intent verwenden, wenn der Entwickler Ihre Komponentennamen bestimmt.
Wenn es wichtig ist, dass nur Ihre eigene App eine Ihrer Komponenten starten kann,
Deklarieren Sie in Ihrem Manifest keine Intent-Filter. Legen Sie stattdessen den Parameter
Attribut exported
für diese Komponente auf "false"
.
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 ein Beispiel aus der Manifestdatei einer App für die soziale Medien-Teilen-Funktion, das einige der Verhaltensweisen von Intent-Filtern veranschaulicht:
<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,
wird geöffnet, 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 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 miticon
angibt, verwendet das System das Symbol aus<application>
-Elements.
Diese beiden Elemente müssen gekoppelt sein, 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.
Das Gleiche gilt, wenn du deine App auf Android 13 aktualisierst.
oder höher, werden alle von externen Apps stammenden Intents an einen
Komponente Ihrer App nur dann exportiert, wenn dieser Intent mit den Aktionen und
Kategorien eines <intent-filter>
-Elements, die in deiner App deklariert sind. Dieses Verhalten
unabhängig von der SDK-Zielversion der sendenden App erfolgt.
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.
- Intents, die aus dem System stammen. also Intents, die vom
„System-UID“ (uid=1000). Zu den System-Apps gehören
system_server
und Apps, die Folgendes festlegen:android:sharedUserId
bisandroid.uid.system
. - Intents aus dem Stammverzeichnis.
Weitere Informationen zum Abgleich nach Nutzerabsicht
Ausstehenden Intent 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:
- Intent angeben, der ausgeführt werden soll, wenn der Nutzer eine Aktion über Ihre Benachrichtigung ausführt
(Die
NotificationManager
des Android-SystemsIntent
) ausführt. - 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. - Die Deklaration eines Intents, der zu einem bestimmten zukünftigen Zeitpunkt ausgeführt werden soll (das Android-
AlarmManager
des Systems führt dieIntent
aus.
So wie jedes Intent
-Objekt von einem bestimmten
Typ der App-Komponente (entweder Activity
, Service
oder
ein BroadcastReceiver
), also muss auch eine PendingIntent
sein
erstellt haben. Wenn Sie einen ausstehenden Intent verwenden,
führen Sie den Intent mit einem Aufruf wie startActivity()
aus. Stattdessen müssen Sie den gewünschten Komponententyp deklarieren, wenn Sie die
PendingIntent
durch Aufrufen der entsprechenden Creator-Methode:
PendingIntent.getActivity()
für einIntent
, die einenActivity
startet.PendingIntent.getService()
für einIntent
, die einenService
startet.PendingIntent.getBroadcast()
für einIntent
, die einenBroadcastReceiver
startet.
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 verwendet die aktuelle App-Context
, den
Intent
, die Sie zusammenfassen möchten, und ein oder mehrere Flags, die angeben,
Art und Weise der Verwendung des Intents (z. B. ob der Intent mehrmals verwendet werden kann)
Weitere Informationen zur Verwendung ausstehender Intents finden Sie in der Dokumentation der einzelnen der jeweiligen Anwendungsfälle, z. B. in den Benachrichtigungen und App Widgets API-Leitfäden.
Veränderlichkeit 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. Um zu erklären, dass
ein bestimmtes PendingIntent
-Objekt änderbar oder unveränderlich ist, verwenden Sie die Methode
PendingIntent.FLAG_MUTABLE
oder
PendingIntent.FLAG_IMMUTABLE
gekennzeichnet.
Wenn Ihre App versucht, ein PendingIntent
-Objekt zu erstellen, ohne eines der Flags für die Mutabilität festzulegen, wirft 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 sollten Ihre Apps 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 der
Nutzerabsicht verstehen.
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:
- Direkte Antwortaktionen in Benachrichtigungen Die
Für eine direkte Antwort müssen die Clipdaten im PendingIntent-Objekt geändert werden
die mit der Antwort verknüpft ist. Normalerweise fordern Sie diese Änderung an, indem Sie
FILL_IN_CLIP_DATA
als Flag für denfillIn()
. - 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änderbarenPendingIntent
-Objekt kann das System die richtigen Flags anwenden, z. B.FLAG_ACTIVITY_MULTIPLE_TASK
undFLAG_ACTIVITY_NEW_DOCUMENT
. - Informationen zum Gerätestandort per Anruf anfordern
requestLocationUpdates()
oder ähnliche APIs. Mit dem änderbaren ObjektPendingIntent
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 werden mit
AlarmManager
geplant. Mit dem änderbaren ObjektPendingIntent
kann das System den ParameterEXTRA_ALARM_COUNT
zusätzliche Absicht. Dieses Extra gibt an, wie oft ein sich wiederholender Wecker ausgelöst wurde. Wenn diese Information enthalten ist, kann die Intent-Nachricht eine App genau darüber informieren, ob ein wiederkehrender Wecker mehrmals ausgelöst wurde, z. B. wenn das Gerät im Ruhemodus war.
Wenn deine App ein änderbares PendingIntent
-Objekt erstellt, wird dringend empfohlen,
Sie einen expliziten Intent verwenden und das Feld
ComponentName
So wird immer dieselbe Komponente in Ihrer App gestartet, wenn eine andere App PendingIntent
aufruft und die Steuerung an Ihre App zurückgibt.
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. Gehen Sie so vor, um diese Best Practice umzusetzen:
- Prüfen Sie, ob die Felder für Aktion, Paket und Komponente des Basis-Intents vorhanden sind. festgelegt sind.
-
Verwenden Sie
FLAG_IMMUTABLE
, in Android 6.0 (API-Level 23) hinzugefügt, um ausstehende Intents zu erstellen. Dieses Flag verhindert, dass Apps, die einePendingIntent
erhalten, das Ausfüllen nicht ausgefüllten Properties. Wenn dasminSdkVersion
deiner App22
oder niedriger können Sie für Sicherheit und Kompatibilität sorgen. mithilfe des folgenden Codes: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:
- Action –
- Daten (sowohl URI als auch Datentyp).
- Kategorie:
In den folgenden Abschnitten wird beschrieben, wie Intents den entsprechenden Komponenten zugeordnet werden. gemäß der Intent-Filterdeklaration in der Manifestdatei einer App.
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>
Um diesen Filter zu übergeben, muss die in Intent
angegebene Aktion
muss einer der im Filter aufgeführten Aktionen entsprechen.
Wenn der Filter keine Aktionen auflistet, ist für eine
damit alle Intents den Test nicht bestehen. Wenn jedoch ein Intent
keine Aktion definiert, besteht sie den Test, solange der Filter
enthält mindestens eine Aktion.
Kategorietest
Zum Festlegen akzeptierter Intent-Kategorien kann ein Intent-Filter null oder mehr deklarieren
<category>
-Elemente, 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 nötig – der Intent-Filter kann
Deklarieren Sie mehr Kategorien als in Intent
und den
Intent
ist noch da. Daher besteht ein Intent ohne Kategorien diesen Test immer, unabhängig davon, welche Kategorien im Filter angegeben sind.
Hinweis:
Android wendet die Kategorie CATEGORY_DEFAULT
automatisch an
an alle impliziten Intents übergeben, 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
Um zulässige Intent-Daten anzugeben, kann ein Intent-Filter null oder mehr <data>
-Elemente angeben, 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 ein Filter nur ein Schema angibt, stimmen alle URIs mit diesem Schema überein. den Filter.
- Gibt ein Filter ein Schema und eine Berechtigung, aber keinen Pfad an, werden alle URIs mit demselben Schema und derselben Befugnis übergeben den Filter unabhängig von ihren Pfaden.
- 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, damit nur eine teilweise Übereinstimmung mit dem Pfadnamen erforderlich ist.
Beim Datentest werden sowohl der URI als auch der MIME-Typ im Intent mit einem URI verglichen und den im Filter angegebenen MIME-Typ. Es gelten folgende Regeln:
- Ein Intent, der weder einen URI noch einen MIME-Typ enthält, übergibt den Test nur, wenn der Filter keine URIs oder MIME-Typen angibt.
- Intent, der einen URI, aber keinen MIME-Typ enthält (weder explizit noch abgeleitet aus dem URI) besteht den Test nur dann, wenn der URI mit dem URI-Format des Filters übereinstimmt. und der Filter gibt ebenfalls keinen MIME-Typ an.
- Ein Intent, der einen MIME-Typ, aber keinen URI enthält, besteht den Test wenn der Filter denselben MIME-Typ auflistet und kein URI-Format angibt.
- 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 bestanden.
entweder wenn der URI mit einem URI im Filter übereinstimmt oder einen
content:
enthält. oderfile:
und der Filter gibt keinen URI an. Mit anderen Worten: Es wird davon ausgegangen, dass eine Komponentecontent:
- undfile:
-Daten unterstützt, wenn In der Filterliste wird nur ein MIME-Typ aufgeführt.
Hinweis:Wenn in einem Intent ein URI oder ein MIME-Typ angegeben ist,
schlägt fehl, wenn keine <data>
-Elemente in <intent-filter>
vorhanden sind.
Die letzte Regel, Regel (d), spiegelt die Erwartung
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 nicht explizit
Benennen Sie die Schemas content:
und file:
.
Das folgende Beispiel zeigt einen typischen Fall, in dem ein <data>
-Element Android mitteilt, dass die Komponente Bilddaten von einem Inhaltsanbieter abrufen und anzeigen kann:
<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. Ein <data>
-Element wie das folgende teilt Android beispielsweise mit, dass die Komponente Videodaten aus dem Netzwerk abrufen kann, 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 die
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.
PackageManager
hat einen Satz von query...()
die alle Komponenten zurückgeben,
die einen bestimmten Intent akzeptieren,
einer ähnlichen Reihe von resolve...()
-Methoden,
Komponente, um auf einen Intent zu reagieren. 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()
.