web-dev-qa-db-fra.com

A quoi sert "requestCode" pour sur PendingIntent?

Contexte:

J'utilise PendingIntent pour les alarmes via AlarmManager.

Le problème:

Au début, je pensais que pour annuler les précédents, je devais fournir le code de requête exact que j'avais utilisé auparavant pour déclencher l'alarme.

Mais ensuite, j'ai découvert que j'avais tort, comme le dit l'API annulation :

Supprimez toutes les alarmes ayant une intention correspondante. Toute alarme, de tout type, dont l'intention correspond à celle-ci (définie par filterEquals (Intent)), seront annulés.

en regardant " filterEquals ", la documentation indique:

Déterminer si deux intentions sont les mêmes aux fins de l'intention résolution (filtrage). C’est-à-dire, si leur action, données, type, classe, et les catégories sont les mêmes. Cela ne compare aucune donnée supplémentaire inclus dans les intentions.

donc je ne comprends pas ce que le "requestCode" est pour ...

La question:

A quoi sert "requestCode"?

Et si je crée plusieurs alarmes avec le même "requestCode"? se substituent-ils les uns aux autres?

81
android developer
  1. requestCode est utilisé pour extraire ultérieurement la même instance d'intention en attente (pour l'annulation, etc.).
  2. Oui, je suppose que les alarmes se substituent les unes aux autres. Je garderais les codes de demande uniques.
65
Minhaj Arfin

Je veux juste ajouter à la réponse de @Minhaj Arfin

1- requestCode est utilisé pour obtenir ultérieurement la même intention en attente (pour l'annulation, etc.)

2- Oui, ils seront remplacés tant que vous spécifiez le même récepteur que votre intention que vous spécifiez dans votre PendingIntent

exemple:

Intent startIntent1 = new Intent(context, AlarmReceiverFirst.class);
PendingIntent pendingIntent1 = PendingIntent.getBroadcast(context, 0, startIntent1, 0);

Intent startIntent2 = new Intent(context, AlarmReceiverSecond.class);
PendingIntent pendingIntent2 = PendingIntent.getBroadcast(context, 0, startIntent2, 0);

Dans l'exemple ci-dessus, ils ne le feront pas se substituent mutuellement car le récepteur est différent (AlarmReceiverFirst et AlarmReceiverSecond).

Intent startIntent2 = new Intent(context, AlarmReceiverSecond.class);
PendingIntent pendingIntent2 = PendingIntent.getBroadcast(context, 0, startIntent2, 0);

Intent startIntent3 = new Intent(context, AlarmReceiverSecond.class);
PendingIntent pendingIntent3 = PendingIntent.getBroadcast(context, 0, startIntent3, 0);

Dans l'exemple ci-dessus, ils vont se substituer mutuellement, car le destinataire est identique (AlarmReceiverSecond)

20
HendraWD

dans mon cas, je veux ouvrir la même activité avec deux intentions différentes, donc si deux FCMS ou plus sont présents dans le bac, l’un d’entre eux n’ouvre que les autres, alors j’ai modifié les codes des demandes d’intention en attente, puis cela a fonctionné.

 PendingIntent pendingIntent =
                            PendingIntent.getActivity(this, **Some unique id for all GCMS** /* Request code */, intent,
                                    PendingIntent.FLAG_ONE_SHOT);
1
JSONParser

une chose importante à propos de 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 si leur requestCode est identique. cela signifie que la pendingIndent que vous définissez sur la remoteViews de votre widget doit être définie sur un seul requestCode, généralement l'identificateur widgetId accompagnant un nombre.

0
Jim