Antworten:
A PendingIntent
ist ein Zeichen , dass Sie zu einer fremden Anwendung geben (zB NotificationManager
, AlarmManager
, Home - Bildschirm AppWidgetManager
oder 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 Intent
mit eigenen Berechtigungen aus. Wenn Sie der fremden Anwendung jedoch eine geben PendingIntent
, führt diese Anwendung Ihre Ausführung Intent
mit der Erlaubnis Ihrer Anwendung aus.
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.
In meinem Fall haben mir weder die obigen Antworten noch die offizielle Dokumentation von Google geholfen, das Konzept der PendingIntent
Klasse 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 PendingIntent
ist, 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(...)
}
}
Warum ist PendingIntent erforderlich? Ich dachte wie
Intent
oder nicht erstellen kannIntent
für den gleichen Zweck verwenden können.Z.BIntent bluetoothIntent= new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
Wenn ich bluetoothIntent
an 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 PendingIntent
der empfangenden Anwendung muss android.permission.BLUETOOTH_ADMIN
Bluetooth nicht aktiviert sein. Quelle .
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);
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
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 ().
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.
PendingIntent
ist im Grunde ein Objekt, das ein anderes Intent
Objekt 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);
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.
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
PendingIntent
Sendung gesendet haben, da Ihre Musik-App über eineREAD_EXTERNAL_STORAGE
Berechtigung verfügt , die die Benachrichtigungs-App nicht hat. Die Benachrichtigung ist ein Systemdienst (es handelt sich also um eine fremde App).
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.
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.