Contexte:
J'utilise PendingIntent pour les alarmes via AlarmManager.
Le problème:
Au début, j'ai pensé que pour annuler les précédents, je devais fournir le requestCode exact que j'ai utilisé auparavant pour déclencher l'alarme.
Mais ensuite, j'ai découvert que j'avais tort, comme le dit l' API d'annulation :
Supprimez toutes les alarmes avec une intention correspondante. Toute alarme, de tout type, dont l'intention correspond à celle-ci (telle que définie par filterEquals (Intent)), sera annulée.
en regardant " filterEquals ", la documentation dit:
Déterminez si deux intentions sont identiques aux fins de la résolution d'intention (filtrage). Autrement dit, si leur action, leurs données, leur type, leur classe et leurs catégories sont identiques. Cela ne compare aucune donnée supplémentaire incluse dans les intentions.
donc je ne comprends pas à quoi sert le "requestCode" ...
La question:
À quoi sert "requestCode"?
Que faire si je crée plusieurs alarmes avec le même "requestCode"? se substituent-ils les uns aux autres?
la source
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.
Réponses:
requestCode
est utilisé pour récupérer ultérieurement la même instance d'intention en attente (pour l'annulation, etc.).la source
Je veux juste ajouter à la réponse @Minhaj Arfin
1- requestCode est utilisé pour obtenir la même intention en attente plus tard (pour l'annulation, etc.)
2- Oui, ils seront remplacés tant que vous spécifiez le même Receiver à votre intention que vous spécifiez sur votre PendingIntent
exemple:
De l'exemple ci-dessus, ils ne se remplaceront pas car le récepteur est différent (AlarmReceiverFirst et AlarmReceiverSecond)
De l'exemple ci-dessus, ils se remplaceront, car le récepteur est le même (AlarmReceiverSecond)
la source
AlarmReceiverSecond.class
sur l'intention, puis utilisezPendingIntent.getService()
. Cela ne fonctionnera pas, carAlarmReceiverSecond.class
c'est unBroadcastReceiver
, pas unService
dans mon cas, je veux ouvrir la même activité avec deux intentions différentes, donc si deux ou plusieurs FCMS sont là dans le bac, l'un d'eux n'ouvrira que l'autre ne le sera pas, donc j'ai changé les codes de demande d'intention en attente, puis cela a fonctionné.
la source
Une chose importante à ce sujet
requestCode
qui gênera sérieusement votre application est l'utilisation de widgets. Les widgets ne fonctionneront pas après le redémarrage du téléphone s'ilsrequestCode
sont identiques. cela signifie que lependingIndent
paramètre que vous définissez sur leremoteViews
de votre widget doit être défini comme un requestCode unique, généralement le widgetId accompagnant un nombre.la source
En fait, la documentation indique clairement à quoi sert le code de requête:
Puisqu'il semble que ce n'est toujours pas si clair, laissez-moi essayer d'expliquer:
Lorsque vous souhaitez utiliser un
PendingIntent
objet, vous ne vous contentez pas d'en instancier un. Au contraire, vous obtenez un à partir du système en utilisant lesPendingIntent
méthodes statiques (getActivity
,getBroadcast
,getService
etc.). Le système conserve un tas d'instances PendingIntent et vous en donne une. Lequel il vous donne, cela dépend des paramètres d'entrée que vous passez à ces méthodes getter. Ces paramètres d'entrée sont:,Context
c'est-à-dire le récepteur cible de l'intention, leIntent
à utiliser,requestCode
etflags
. Lorsque vous transmettez la mêmeContext
, la mêmerequestCode
et la même intention (c'est-à-dire une intentionfilterEquals
avec une autre intention), vous obtenez le mêmePendingIntent
objet. Le fait est que le système veut avoir le moins d'PendingIntent
objets possible, donc il a tendance à réutiliser autant que possible les objets existants.Par exemple, vous avez deux notifications de calendrier, pour deux dates différentes. Lorsque vous cliquez sur l'un d'entre eux, vous souhaitez que votre application s'ouvre à la date correspondante de cette notification. Dans ce scénario, vous avez la même
Context
cible et l'Intent
objet que vous passez ne diffère que par EXTRA_DATA (qui spécifie la date qui doit être ouverte). Si vous fournissez la même choserequestCode
lors de l'obtention de l'PendingIntent
objet, vous vous retrouverez avec le mêmePendingIntent
objet. Ainsi, lors de la création de la deuxième notification, vous remplacerez l'ancienIntent
objet par le nouveau EXTRA_DATA, et vous vous retrouverez avec deux notifications pointant vers la même date.Si vous souhaitez avoir deux
PendingIntent
objets différents , comme vous le devriez dans ce scénario, vous devez en spécifier un différentrequestCode
lors de l'obtention de l'PendingIntent
objet.la source