2015-04-08 11 views
14

Dokumentation für PendingIntent.FLAG_NO_CREATE lautet:Wie android nicht vergleichen anhängige Absichten

Flag, das angibt, dass, wenn die beschriebene PendingIntent nicht bereits vorhanden ist, dann einfach null zurück, anstatt sie zu schaffen.

Meine Frage: Welche Kriterien werden verwendet, um PendingIntents zu vergleichen?

Ich rate unter der Haube diese Flagge verwendet PendingIntent.equals, aber ich bin nicht wirklich sicher, welche Kriterien diese Funktion verwendet. Ist es die Aktion, requestCode, Kategorien, Extras (ich denke nein), etc.?

Kontext:

Ich möchte einen Alarm mit einer anstehenden Absicht starten, wenn mein Wecker nicht bereits eingerichtet ist. Konkret folge ich diesem answer.

Intent i = new Intent(applicationContext, MyService.class); 
i.setAction("myAction"); 
PendingIntent pi = PendingIntent.getService(applicationContext, /*requestCode*/0, i, PendingIntent.FLAG_NO_CREATE); 
if (pi != null) { 
    AlarmManager alarmMgr = (AlarmManager)applicationContext.getSystemService(Context.AlarmService); 
    alarmMgr.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, AlarmManager.INTERVAL_HOUR, AlarmManager.INTERVAL_HOUR, pi); 
} 
+4

Schöne Frage. Ich weiß, das ist nicht richtig. Aber ich habe den vorherigen Alarm abgebrochen und neu gestartet, wann immer ich es für nötig hielt .. Ich freue mich auf die Antwort dieser Frage. –

+0

Ich schätze seinen requestCode nur. Können Sie nicht auf die Quelle zugreifen, um sie zu überprüfen? Android Studio zeigt es normalerweise an. – Stan

Antwort

18

Um zu bestimmen, ob zwei PendingIntent s Spiel, ist folgendes gleich sein:

  • Der requestCode verwendete Parameter, wenn der PendingIntent
  • Die Intent ACTION
  • erstellt wurde
  • Die Intent KATEGORIEN
  • Die Intent DATA
  • Die Intent MIMETYPE
  • Die Intent PAKET
  • Die Intent COMPONENT

Extras sind nicht berücksichtigt.

Sie können mehr in den PendingIntent summary documentation und Intent.filterEquals() lesen.

+2

Ich suchte ** Extras ** Teil, also danke! –

2

Ich vermute, unter der Haube dieses Flag PendingIntent.equals verwendet, aber ich bin nicht wirklich sicher, welche Kriterien, die Funktion ist. Verwendet es die Aktion, requestCode, Kategorien, Extras (ich denke nicht), etc.?

Eigentlich ist der Hinweis in Klassenbeschreibung:

Eine Beschreibung einer Aktionsabsicht und Ziel mit ihm durchzuführen. Instanzen dieser Klasse sind mit

getActivity erstellt (android.content.Context, int, android.content.Intent, int), getActivities (android.content.Context, int, android.content.Intent [], int), getBroadcast (android.content.Context, int, android.content.Intent, int), getService (android.content.Context, int, android.content.Intent, int);

Das zurückgegebene Objekt kann an andere Anwendungen übergeben werden, sodass sie die von Ihnen in Ihrem Auftrag beschriebene Aktion zu einem späteren Zeitpunkt ausführen können ( ). Wenn Sie einer anderen Anwendung einen PendingIntent übergeben, erteilen Sie ihm das Recht, die von Ihnen angegebene Operation so auszuführen, als wäre die andere -Anwendung die gleiche (mit denselben Berechtigungen und derselben Identität). Als sollten Sie vorsichtig sein, wie Sie die PendingIntent: fast immer, zum Beispiel die Basis Intent Sie liefern sollte die Komponentenname explizit auf eine Ihrer eigenen Komponenten festgelegt, um sicherzustellen, es schließlich dort gesendet wird und nirgendwo sonst.

Ein PendingIntent selbst ist einfach ein Verweis auf ein Token, das vom System verwaltet wird, das die ursprünglichen Daten beschreibt, die verwendet werden, um es abzurufen. Dies bedeutet, dass der PendingIntent selbst von anderen Prozessen, die ihm zugewiesen wurden, verwendet werden kann, selbst wenn der Prozess der besitzenden Anwendung beendet wird.Wenn die Anwendung später die gleiche Art von PendingIntent (gleiche Operation, gleiche Intent-Aktion, Daten, Kategorien und Komponenten, und dieselben Flags) erneut abruft, erhält sie einen PendingIntent, der das gleiche Token darstellt, wenn das immer noch der Fall ist gültig und kann cancel() aufrufen, um es zu entfernen.

Aufgrund dieses Verhaltens ist es wichtig zu wissen, wann zwei Intents als zum Abrufen eines PendingIntent identisch angesehen werden. Ein häufiger Fehler, den Menschen machen, besteht darin, mehrere PendingIntent Objekte mit Intents zu erstellen, die sich nur in ihrem "Extra" Inhalt unterscheiden, in der Erwartung, jedes Mal einen anderen PendingIntent zu erhalten. Dies geschieht nicht passieren. Die Teile der Absicht, die für den Abgleich verwendet werden, sind die , die von Intent.filterEquals definiert sind. Wenn Sie zwei Intent Objekte verwenden, die äquivalent nach Intent.filterEquals sind, erhalten Sie denselben PendingIntent für beide.

Es gibt zwei typische Möglichkeiten, damit umzugehen.

Wenn Sie wirklich mehr verschiedenen PendingIntent Objekte aktiv zur gleichen Zeit (wie die Verwendung als zwei Benachrichtigungen, die beide zur gleichen Zeit dargestellt) benötigt, dann werden Sie Notwendigkeit gibt, um sicherzustellen, ist etwas, das anders ist über sie zu verbinden sie mit verschiedenen PendingIntents. Dies kann ein beliebiger der Intent-Attribute sein, die von Intent.filterEquals berücksichtigt werden, oder andere Anforderungscode-Ganzzahlen, die an übergeben werden. GetActivity (android.content.Context, int, android.content.Intent, int), getActivities (android.content. Kontext, int, android.content.Intent [], int), getBroadcast (android.content.Context, int, android.content.Intent, int), oder getService (android.content.Context, int, android.content . Intent, int).

Wenn Sie nur für eine der Intents ein PendingIntent aktiv zu einer Zeit benötigen Sie verwenden, dann können Sie alternativ die Fahnen FLAG_CANCEL_CURRENT oder FLAG_UPDATE_CURRENT verwenden entweder stornieren oder ändern, was auch immer aktuelle PendingIntent mit der Absicht verbunden ist, Sie sind liefern.

aus: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.0.0_r1/android/app/PendingIntent.java#PendingIntent

+0

Ich frage, was diese Funktion tut: "Ich rate unter der Haube dieses Flag verwendet [PendingIntent.equals] (https://github.com/android/platform_frameworks_base/blob/59701b9ba5c453e327bc0e6873a9f6ff87a10391/core/java/android/app /PendingIntent.java#L915), aber ich bin mir nicht sicher, welche Kriterien diese Funktion verwendet. " –

+0

Normalerweise sehen Leute die Quelle, um sucj Dinge zu verstehen und das ist, warum ich es dir zeige. – Stan

+0

Normalerweise schätze ich Quellcode in einer Antwort! Es ist normalerweise großartig, eine Antwort zu erklären/zu unterstützen. Aber ich habe einen Link zu genau dem Code eingefügt, den du eingefügt hast. Ich verstehe diesen Code nicht, deshalb suche ich nach einer Erklärung, nicht nur nach einer Kopie/Vergangenheit des Codes, mit dem ich verlinkt bin. –