Was ist ein Android PendingIntent?

538

Ich bin ein Neuling bei Android. Ich habe die Android-Dokumentation gelesen, brauche aber noch weitere Erläuterungen. Kann mir jemand sagen, was genau ein PendingIntentist?

Rakesh
quelle

Antworten:

892

A PendingIntentist ein Zeichen , dass Sie zu einer fremden Anwendung geben (zB NotificationManager, AlarmManager, Home - Bildschirm AppWidgetManageroder andere 3rd - Party - Anwendungen), die die fremde Anwendung ermöglicht es Ihre Anwendung Berechtigungen verwenden , um einen vordefinierten Stück Code auszuführen .

Wenn Sie der ausländischen Anwendung eine Absicht geben, führt sie Ihre Intentmit eigenen Berechtigungen aus. Wenn Sie der fremden Anwendung jedoch eine geben PendingIntent, führt diese Anwendung Ihre Ausführung Intentmit der Erlaubnis Ihrer Anwendung aus.

Lie Ryan
quelle
3
Wo haben Sie außer Benachrichtigungen noch die Verwendung von ausstehenden Inntents gesehen? Ich glaube, ich habe nur Benachrichtigungen gesehen, die es benutzen ...
Android-Entwickler
4
@Johnny_D: Dies bedeutet, dass im Allgemeinen eine explizite Absicht erstellt werden soll, deren Komponentenname ein absoluter Name ist, der sich eindeutig auf eine Ihrer eigenen Klassen bezieht. Andernfalls wird der Intent möglicherweise an eine andere Anwendung gesendet, was zu Problemen führen kann, da dieser Intent mit der Erlaubnis Ihrer Anwendung ausgeführt wird.
Lie Ryan
3
@LieRyan, ist die Anwendungsberechtigung hier die Berechtigung, die wir im Manifest angeben? Z.B. INTERNET-Erlaubnis?
Diffy
2
Ist diese "Übergabe von Berechtigungen" in Bezug auf die Sicherheit nicht wirklich schlecht? Ich habe eine Anwendung A, für die ich mehrere Berechtigungen erteilt habe. Dann habe ich Anwendung B, die viel weniger Berechtigungen verwendet. Wenn Anwendung A über einen PendingIntent etwas in Anwendung B starten kann (damit alle Berechtigungen von A vorübergehend auf B sind), kann B mit dieser Berechtigung nicht hinter den Kulissen alles tun, was es kann? Beispielsweise hat A möglicherweise die Berechtigung, die Kontakte des Benutzers zu lesen, B jedoch nicht. Wenn A einen PendingIntent an B sendet, kann B die Kontakte lesen und etwas Bösartiges tun (z. B. an einen Server senden).
Tiago
6
@Tiago: In Ihrem Fall, wenn eine privilegierte Anwendung A der Anwendung B eine ausstehende Absicht gibt, damit B sie senden kann, wenn sie Kontaktdaten lesen möchte. Es liegt in der Verantwortung von A, den Benutzer zu fragen, welche Kontaktdaten der Benutzer an B weitergeben möchte, und nur B diese Daten zu geben. Pending Intent ist ein Mechanismus zur Eskalation von Privilegien, und genau wie jeder Mechanismus zur Eskalation von Privilegien geht mit großer Macht eine große Verantwortung einher. Es liegt in der Verantwortung des Benutzers, zu entscheiden, ob Anwendung B für die vom Benutzer ausgewählten Kontaktdaten vertrauenswürdig ist.
Lie Ryan
48

Eine ausstehende Absicht ist ein Token, das Sie einer App geben, um eine Aktion im Namen Ihrer Apps auszuführen unabhängig davon, ob Ihr Bewerbungsprozess aktiv ist oder nicht.

Ich denke, die Dokumentation ist ausreichend detailliert: Pending Intent-Dokumente .

Denken Sie nur an Anwendungsfälle für ausstehende Absichten wie (Broadcasting Intents, Planen von Alarmen), und die Dokumentation wird klarer und aussagekräftiger.

Samuh
quelle
Ich denke, Absicht ist auch eine Art Token, das wir einer anderen App geben, um eine Aktion im Namen unserer App auszuführen. Der einzige Unterschied zwischen einer ausstehenden Absicht und einer beabsichtigten Absicht besteht in der Lebensdauer unseres Bewerbungsprozesses.
CopsOnRoad
40

In meinem Fall haben mir weder die obigen Antworten noch die offizielle Dokumentation von Google geholfen, das Konzept der PendingIntentKlasse zu verstehen .

Und dann fand ich dieses Video, Google I / O 2013, Beyond the Blue Dot- Sitzung . In diesem Video erklärt Ex-Googler Jaikumar Ganesh, was PendingIntentist, und das war es, was mir das große Bild davon gab.

Unten ist nur die Transkription des obigen Videos ( ab 15:24 ).

Was ist also eine ausstehende Absicht?

Es ist ein Token, das Ihr App-Prozess dem Standortprozess gibt, und der Standortprozess verwendet es, um Ihre App zu aktivieren, wenn ein Ereignis von Interesse eintritt . Das bedeutet also im Grunde, dass Ihre App im Hintergrund nicht immer ausgeführt werden muss. Wenn etwas Interessantes passiert, werden wir Sie wecken. Das spart viel Batterie.

Diese Erklärung wird mit diesem Codeausschnitt (der auf der Folie der Sitzung enthalten ist) deutlicher.

PendingIntent mIntent = PendingIntent.getService(...);

mLocationClient.requestLocationUpdates(locationRequest, mIntent);

public void onHandleIntent(Intent intent) {   
    String action = intent.getAction();   
    if (ACTION_LOCATION.equals(action)) {       
        Location location = intent.getParcelableExtra(...)   
    }
}
김준호
quelle
Stimmen Sie zu, es ist ganz einfach und klar zu verstehen. Es sagt uns jedoch nichts über die Erlaubnis aus, die PendingIntent einer anderen App erteilt.
CopsOnRoad
35

Warum ist PendingIntent erforderlich? Ich dachte wie

  1. Warum die empfangende Anwendung selbst das Intentoder nicht erstellen kann
  2. Warum wir ein einfaches nicht Intentfür den gleichen Zweck verwenden können.

Z.BIntent bluetoothIntent= new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);

Wenn ich bluetoothIntentan eine andere Anwendung sende , die keine Berechtigung hat android.permission.BLUETOOTH_ADMIN, kann diese empfangende Anwendung Bluetooth nicht mit aktivieren startActivity(bluetoothIntent).

Die Einschränkung wird mit überwunden PendingIntent. Bei PendingIntentder empfangenden Anwendung muss android.permission.BLUETOOTH_ADMINBluetooth nicht aktiviert sein. Quelle .

Kiran
quelle
3
Ihr bluetoothIntent-Beispiel ist wirklich wertvoll. Danke
Nicks
1
@Kiran - Wenn der Empfang einer Anwendung Bluetooth (mit Pending Intent) aktivieren kann, warum hat diese App diese Berechtigung dann nicht in ihr Manifest aufgenommen? Es ist, als würde ich eine App erstellen, die einen Anruf tätigen kann, aber ich schließe die Berechtigung CALL_PHONE nicht ein, da ich möchte, dass eine andere App mir eine ausstehende Absicht sendet, um diesen Anruf zu tätigen. Wollen Sie das sagen?
CopsOnRoad
1
@CopsOnRoad Die empfangende App des PendingIntent kann eine allgemeine App sein, die jede Anforderung empfängt und die Anforderung im Namen des Anforderers ausführt. Seine Rolle ist nur ein Mittelsmann, daher verfügt er nicht über alle Berechtigungen. Ein Beispiel für diese Art von Middle-Man-Apps ist der Benachrichtigungsmanager, mit dem alle beabsichtigten Apps aus einer Benachrichtigung heraus gestartet werden können, ohne die Berechtigung zu besitzen.
Xiao-Feng Li
21

Die anstehende Absicht ist eine Absicht, die irgendwann in der Zukunft beginnen wird. Die normale Absicht beginnt sofort, wenn sie an startActivity(Intent)oder übergeben wird StartService(Intent).

Arun P.
quelle
13

Eine zukünftige Absicht, die andere Apps verwenden können.
Und hier ist ein Beispiel für die Erstellung eines:

Intent intent = new Intent(context, MainActivity.class);
PendingIntent pendIntent = PendingIntent.getActivity(context, 0, intent, 0);
Oded Breiner
quelle
8
Downvote, weil Sie nicht wirklich erklären, was das Besondere an einer Absicht ist, die "Zukunft" ist oder von anderen Apps verwendet werden kann
Vic
@ WhereDatApp.com es wurde von Antoine de Saint Exupéry gesagt und von Lewis Galantière übersetzt;)
Choletski
@Choletski danke, ich wusste nicht über die Übersetzung 👍
Oded Breiner
13

TAXI-ANALOGIE

Absicht

Absichten werden normalerweise zum Starten von Diensten verwendet. Zum Beispiel:

Intent intent = new Intent(CurrentClass.this, ServiceClass.class);
startService(intent);

Dies ist wie wenn Sie ein Taxi rufen:

Myself = CurrentClass
Taxi Driver = ServiceClass

Ausstehende Absicht

Sie müssen so etwas verwenden:

Intent intent = new Intent(CurrentClass.this, ServiceClass.class);
PendingIntent pi = PendingIntent.getService(parameter, parameter, intent, parameter);
getDataFromThirdParty(parameter, parameter, pi, parameter);

Jetzt startet dieser Dritte den Dienst, der in Ihrem Namen handelt. Eine echte Analogie ist Uber oder Lyft, die beide Taxiunternehmen sind.

Sie senden eine Anfrage für eine Fahrt nach Uber / Lyft. Sie werden dann einen ihrer Fahrer in Ihrem Namen anrufen.

Deshalb:

Uber/Lyft ------ ThirdParty which receives PendingIntent
Myself --------- Class calling PendingIntent
Taxi Driver ---- ServiceClass
ARCHE
quelle
11

Ein PendingIntent ist ein Token, das Sie einer anderen Anwendung (z. B. Notification Manager, Alarm Manager oder anderen Anwendungen von Drittanbietern) geben, mit dem diese andere Anwendung die Berechtigungen Ihrer Anwendung verwenden kann, um einen vordefinierten Code auszuführen. Um eine Übertragung über eine ausstehende Absicht durchzuführen, rufen Sie einen PendingIntent über PendingIntent.getBroadcast () ab. Um eine Aktivität über eine ausstehende Absicht auszuführen, erhalten Sie die Aktivität über PendingIntent.getActivity ().

srinu
quelle
7

Was ist eine Absicht?

Ein Intent ist ein bestimmter Befehl in Android, mit dem Sie einen Befehl an das Android-Betriebssystem senden können, um etwas Bestimmtes zu tun. Stellen Sie sich das wie eine Aktion vor, die stattfinden muss. Es gibt viele Aktionen, die ausgeführt werden können, z. B. das Senden einer E-Mail, das Anhängen eines Fotos an eine E-Mail oder sogar das Starten einer Anwendung. Der logische Workflow zum Erstellen einer Absicht lautet normalerweise wie folgt: a. Erstellen Sie die Absicht b. Absichtsoptionen hinzufügen -> Bsp. Welche Art von Absicht senden wir an das Betriebssystem oder welche mit dieser Absicht verbundenen Attribute, wie z. B. eine Textzeichenfolge oder etwas, das mit der Absicht weitergegeben wird? c. RUN the Intent

Beispiel aus dem wirklichen Leben: Nehmen wir an, ich wache morgens auf und "beabsichtige", in den Waschraum zu gehen. Ich muss zuerst darüber nachdenken, in den Waschraum zu gehen, aber das bringt mich nicht wirklich in den Waschraum. Ich muss dann meinem Gehirn sagen, dass es zuerst aus dem Bett aufstehen, dann zum Waschraum gehen und dann loslassen, dann meine Hände waschen und dann meine Hände abwischen soll. Sobald ich weiß, wohin ich gehe, sende ich den Befehl, um zu beginnen, und mein Körper ergreift Maßnahmen.

Was sind ausstehende Absichten?

Nehmen wir an, ich möchte duschen, aber ich möchte duschen, nachdem ich mir die Zähne geputzt und gefrühstückt habe. Ich weiß also, dass ich erst nach mindestens 30-40 Minuten duschen werde. Ich habe immer noch im Kopf, dass ich meine Kleidung vorbereiten und dann die Treppe zurück ins Badezimmer gehen muss, mich dann ausziehen und dann duschen muss. Dies wird jedoch erst nach 30-40 Minuten geschehen. Ich habe jetzt die ANHÄNGIGE Absicht zu duschen. Es steht 30-40 Minuten an.

Das ist so ziemlich der Unterschied zwischen einer ausstehenden Absicht und einer regulären Absicht. Reguläre Absichten können ohne ausstehende Absicht erstellt werden. Um jedoch eine ausstehende Absicht zu erstellen, müssen Sie zuerst eine reguläre Absicht einrichten.

Narendra Motwani
quelle
Das Einfache und das Beispiel haben mir sehr gut gefallen, ich habe es mit diesen Worten ziemlich gut verstanden.
Josema
Ich bin froh, dass dieser Beitrag für Sie nützlich ist Josema
Narendra Motwani
Dies ist genau das gleiche wie Shakeeb Ayaz 'Erklärung oben. Wer hat von wem kopiert? :)
Likejudo
5

PendingIntentist im Grunde ein Objekt, das ein anderes IntentObjekt umschließt . Dann kann es an eine fremde Anwendung übergeben werden, in der Sie dieser App das Recht einräumen, den Vorgang auszuführen, dh die Absicht so auszuführen, als ob sie aus dem Prozess Ihrer eigenen App ausgeführt worden wäre (gleiche Berechtigung und Identität). Aus Sicherheitsgründen sollten Sie immer explizite Absichten an ein PendingIntent übergeben, anstatt implizit zu sein.

 PendingIntent aPendingIntent = PendingIntent.getService(Context, 0, aIntent,
                    PendingIntent.FLAG_CANCEL_CURRENT);
Gowtham Subramaniam
quelle
4

In einer einfachen Sprache:
1. Eine Beschreibung einer durchzuführenden Absichts- und Zielaktion. Zuerst müssen Sie eine Absicht erstellen und dann eine bestimmte Java-Klasse, die Sie ausführen möchten, an die Absicht übergeben.
2. Sie können diese Java-Klasse, die Ihre Klassenaktionsklasse ist, über PendingIntent.getActivity, PendingIntent.getActivities (Context, int, Intent [], int), PendingIntent.getBroadcast (Context, int, Intent, int) und PendingIntent aufrufen. getService (Context, int, Intent, int); Hier sehen Sie die Absicht, die aus Schritt 1 stammt.
3. Beachten Sie Folgendes: Wenn Sie einer anderen Anwendung einen PendingIntent zuweisen, gewähren Sie ihr das Recht, den von Ihnen angegebenen Vorgang auszuführen.

Das habe ich nach langer Lektüre gelernt.

Omar Faroque Anik
quelle
3

Ein PendingIntent umschließt die allgemeine Absicht mit einem Token, das Sie einer fremden App geben, um sie mit Ihrer Erlaubnis auszuführen. Zum Beispiel:

Die Benachrichtigung Ihrer Musik-App kann die Musik nicht abspielen / anhalten, wenn Sie nicht die PendingIntentSendung gesendet haben, da Ihre Musik-App über eine READ_EXTERNAL_STORAGEBerechtigung verfügt , die die Benachrichtigungs-App nicht hat. Die Benachrichtigung ist ein Systemdienst (es handelt sich also um eine fremde App).

Ashish Rawat
quelle
tolles Beispiel!
Likejudo
2

Wie der Name schon sagt .. PendingIntent

Sie können es anhängen (nach einiger Zeit tun). Es funktioniert wie die andere Absicht. Es ist eine Möglichkeit, Ihre Aufgabe einer anderen App zu übertragen, die in Ihrem Namen ausgeführt werden soll.

Jawad Zeb
quelle
1
Können Sie ein Beispiel aus dem wirklichen Leben dafür geben?
CopsOnRoad
0

Eine ausstehende Absicht gibt eine Aktion an, die in Zukunft ausgeführt werden soll. Sie können eine zukünftige Absicht an eine andere Anwendung übergeben und dieser Anwendung erlauben, diese Absicht so auszuführen, als ob sie dieselben Berechtigungen wie Ihre Anwendung hätte, unabhängig davon, ob Ihre Anwendung noch vorhanden ist, wenn die Absicht schließlich aufgerufen wird.

Es ist ein Token, das Sie einer fremden Anwendung geben, mit dem die fremde Anwendung die Berechtigungen Ihrer Anwendung verwenden kann, um einen vordefinierten Code auszuführen.

Wenn Sie der fremden Anwendung eine Absicht geben und diese Anwendung die von Ihnen angegebene Absicht sendet / sendet, wird die Absicht mit ihren eigenen Berechtigungen ausgeführt. Wenn Sie der fremden Anwendung stattdessen eine ausstehende Absicht erteilen, die Sie mit Ihrer eigenen Berechtigung erstellt haben, führt diese Anwendung die enthaltene Absicht mit der Berechtigung Ihrer Anwendung aus.

Um eine Übertragung über eine ausstehende Absicht durchzuführen, rufen Sie einen PendingIntent über PendingIntent.getBroadcast () ab. Um eine Aktivität über eine ausstehende Absicht auszuführen, erhalten Sie die Aktivität über PendingIntent.getActivity ().

Es ist eine Absichtsaktion, die Sie ausführen möchten, jedoch zu einem späteren Zeitpunkt. Stellen Sie sich vor, Sie wollen eine Absicht auf Eis legen. Der Grund dafür ist, dass eine Absicht aus einem gültigen Kontext in Ihrer Anwendung erstellt und gestartet werden muss. In bestimmten Fällen ist jedoch eine Absicht zum Zeitpunkt der Ausführung der Aktion nicht verfügbar, da Sie sich technisch außerhalb des Anwendungskontexts befinden (the Zwei gängige Beispiele sind das Starten einer Aktivität über eine Benachrichtigung oder einen BroadcastReceiver.

Indem Sie ein PendingIntent erstellen, mit dem Sie beispielsweise eine Aktivität starten möchten, während Sie über den entsprechenden Kontext verfügen (innerhalb einer anderen Aktivität oder eines anderen Dienstes), können Sie dieses Objekt an etwas Externes weitergeben, damit es einen Teil Ihrer Anwendung startet in Ihrem Namen.

Ein PendingIntent bietet Anwendungen die Möglichkeit, auch nach dem Beenden des Prozesses zu arbeiten. Es ist wichtig zu beachten, dass Intent auch dann ausgeführt werden kann, wenn die Anwendung, die das PendingIntent erstellt hat, beendet wurde. Eine Beschreibung einer Absichts- und Zielaktion, die damit ausgeführt werden soll. Instanzen dieser Klasse werden mit getActivity (Kontext, int, Absicht, int), getBroadcast (Kontext, int, Absicht, int), getService (Kontext, int, Absicht, int) erstellt. Das zurückgegebene Objekt kann an andere Anwendungen übergeben werden, damit diese die von Ihnen in Ihrem Namen beschriebene Aktion zu einem späteren Zeitpunkt ausführen können.

Indem Sie einer anderen Anwendung einen PendingIntent zuweisen, gewähren Sie ihr das Recht, den von Ihnen angegebenen Vorgang so auszuführen, als ob die andere Anwendung Sie selbst wäre (mit denselben Berechtigungen und derselben Identität). Daher sollten Sie beim Erstellen des PendingIntent vorsichtig sein: Oft wird beispielsweise bei der von Ihnen angegebenen Basisabsicht der Komponentenname explizit auf eine Ihrer eigenen Komponenten festgelegt, um sicherzustellen, dass er letztendlich dorthin und nirgendwo anders gesendet wird.

Ein PendingIntent selbst ist einfach ein Verweis auf ein vom System verwaltetes Token, das die ursprünglichen Daten beschreibt, die zum Abrufen verwendet wurden. Dies bedeutet, dass der PendingIntent selbst, selbst wenn der Prozess seiner eigenen Anwendung beendet wird, von anderen Prozessen, die ihm zugewiesen wurden, verwendet werden kann. Wenn die erstellende Anwendung später dieselbe Art von PendingIntent (dieselbe Operation, dieselbe Absichtsaktion, dieselben Daten, Kategorien und Komponenten sowie dieselben Flags) erneut abruft, erhält sie eine PendingIntent, die dasselbe Token darstellt, sofern dies noch gültig ist, und kann Rufen Sie daher cancel () auf, um es zu entfernen.

vikseln
quelle
0

Pending Intent ist eine Absicht, die anderen Anwendungen die Erlaubnis erteilt, bestimmte Arbeiten auszuführen. Wenn die Hauptaktivität zerstört wird, nimmt das Android-Betriebssystem die Berechtigung zurück.

Neimer
quelle