Hintergrund:
Ich verwende PendingIntent für Alarme über AlarmManager.
Das Problem:
Zuerst dachte ich, um vorherige abzubrechen, muss ich den genauen requestCode angeben, den ich zuvor zum Starten des Alarms verwendet habe.
Aber dann habe ich herausgefunden, dass ich falsch lag, wie die Stornierungs-API sagt:
Entfernen Sie alle Alarme mit einer passenden Absicht. Jeder Alarm jeglicher Art, dessen Absicht mit dieser übereinstimmt (wie durch filterEquals (Absicht) definiert), wird abgebrochen.
In der Dokumentation zu " filterEquals " heißt es:
Stellen Sie fest, ob zwei Absichten zum Zwecke der Absichtsauflösung (Filterung) gleich sind. Das heißt, wenn Aktion, Daten, Typ, Klasse und Kategorien identisch sind. Dadurch werden keine zusätzlichen Daten verglichen, die in den Absichten enthalten sind.
Ich verstehe also nicht, wofür der "requestCode" ist ...
Die Frage:
Wofür wird "requestCode" verwendet?
Was ist, wenn ich mehrere Alarme mit demselben "requestCode" erstelle? überschreiben sie sich gegenseitig?
quelle
If you truly need multiple distinct PendingIntent objects active at the same time (such as to use as two notifications that are both shown at the same time), then you will need to ensure there is something that is different about them to associate them with different PendingIntents. This may be any of the Intent attributes considered by Intent#filterEquals(Intent), or different request code integers supplied.
Antworten:
requestCode
wird verwendet, um dieselbe ausstehende Absichtsinstanz später abzurufen (zum Abbrechen usw.).quelle
Ich möchte nur die Antwort von @Minhaj Arfin hinzufügen
1- requestCode wird verwendet, um später dieselbe ausstehende Absicht zu erhalten (zum Abbrechen usw.)
2- Ja, sie werden überschrieben, solange Sie denselben Empfänger für Ihre Absicht angeben, den Sie in Ihrem PendingIntent angegeben haben
Beispiel:
Im obigen Beispiel überschreiben sie sich nicht, da der Empfänger unterschiedlich ist (AlarmReceiverFirst und AlarmReceiverSecond).
Von obigen Beispiel sie werden sich gegenseitig zu überschreiben, da der Empfänger gleich ist (AlarmReceiverSecond)
quelle
AlarmReceiverSecond.class
auf die Absicht verwenden und dann verwendenPendingIntent.getService()
. Es wird nicht funktionieren, daAlarmReceiverSecond.class
es einBroadcastReceiver
, keinService
In meinem Fall möchte ich dieselbe Aktivität mit zwei verschiedenen Absichten öffnen. Wenn also zwei oder mehr FCMS in der Taskleiste vorhanden sind, öffnet einer von ihnen nur den anderen, nicht, also habe ich die Anforderungscodes für ausstehende Absichten geändert, dann hat es funktioniert.
quelle
Eine wichtige Sache
requestCode
, die Ihre App ernsthaft stören wird, ist die Verwendung von Widgets. Widgets funktionieren nach dem Neustart des Telefons nicht, wenn sierequestCode
identisch sind. Das bedeutet, dass für das, waspendingIndent
Sie inremoteViews
Ihrem Widget festgelegt haben, ein eindeutiger requestCode festgelegt werden muss, normalerweise die Widget-ID, die einer Nummer beiliegt.quelle
Tatsächlich wird in der Dokumentation klar angegeben, wofür der Anforderungscode verwendet wird:
Da es immer noch nicht so klar zu sein scheint, möchte ich versuchen zu erklären:
Wenn Sie ein
PendingIntent
Objekt verwenden möchten, instanziieren Sie nicht nur eines. Vielmehr erhalten Sie eine aus dem System der Verwendung vonPendingIntent
statischen Methoden (getActivity
,getBroadcast
,getService
usw.). Das System verwaltet eine Reihe von PendingIntent-Instanzen und gibt Ihnen eine. Welches es Ihnen gibt, hängt von den Eingabeparametern ab, die Sie an diese Getter-Methoden übergeben. Diese Eingabeparameter sind:Context
dh der Zielempfänger der Absicht, derIntent
zu verwendenderequestCode
undflags
. Wenn Sie dieselbeContext
, dieselberequestCode
und dieselbe Absicht übergeben (was bedeutet, dass eine AbsichtfilterEquals
mit einer anderen Absicht vorliegt), erhalten Sie dasselbePendingIntent
Objekt. Der Punkt ist, dass das System so wenigPendingIntent
Objekte wie möglich haben möchte , so dass es dazu neigt, die vorhandenen Objekte so weit wie möglich wiederzuverwenden.Sie haben beispielsweise zwei Kalenderbenachrichtigungen für zwei verschiedene Daten. Wenn Sie auf eine davon klicken, soll Ihre App zum entsprechenden Datum dieser Benachrichtigung geöffnet werden. In diesem Szenario haben Sie dasselbe
Context
Ziel, und dasIntent
Objekt, das Sie übergeben, unterscheidet sich nur in EXTRA_DATA (das das Datum angibt, das geöffnet werden soll). Wenn SierequestCode
beim Abrufen desPendingIntent
Objekts dasselbe angeben , erhalten Sie dasselbePendingIntent
Objekt. Wenn Sie also die zweite Benachrichtigung erstellen, ersetzen Sie die alteIntent
Objekt durch das neue EXTRA_DATA und erhalten zwei Benachrichtigungen, die auf dasselbe Datum verweisen.Wenn Sie
PendingIntent
wie in diesem Szenario zwei verschiedene Objekte haben möchten, sollten SierequestCode
beim Abrufen desPendingIntent
Objekts ein anderes angeben .quelle