web-dev-qa-db-fra.com

La notification passe par les anciens suppléments d'intention

je crée une notification à l'intérieur d'un BroadcastReceiver via ce code:

String ns = Context.NOTIFICATION_SERVICE;
        NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(ns);
        int icon = R.drawable.ic_stat_notification;
        CharSequence tickerText = "New Notification";
        long when = System.currentTimeMillis();

        Notification notification = new Notification(icon, tickerText, when);
        notification.defaults |= Notification.DEFAULT_VIBRATE;
        long[] vibrate = {0,100,200,200,200,200};
        notification.vibrate = vibrate;
        notification.flags |= Notification.FLAG_AUTO_CANCEL;

        CharSequence contentTitle = "Title";
        CharSequence contentText = "Text";
        Intent notificationIntent = new Intent(context, NotificationActivity.class);
        notificationIntent.putExtra(Global.INTENT_EXTRA_FOO_ID, foo_id);
PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);

        notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);

        int mynotification_id = 1;

        mNotificationManager.notify(mynotification_id, notification);

Lorsque je clique sur la notification, il ouvre NotificationActivity et, à l'intérieur de l'activité, je peux récupérer le foo_id dans Intent-Bundle (par exemple 1).

Cependant, si une autre notification est déclenchée et que je clique à nouveau dessus, l'activité reçoit toujours la "vieille" valeur (1) de l'ensemble Intent. J'ai essayé d'effacer le paquet avec clear (), mais je reçois le même effet. Je pense que qc a tort avec mon code ..

114
BrianM

Vous envoyez le même code de demande pour votre attente en attente . Modifiez ceci:

PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);

À:

PendingIntent contentIntent = PendingIntent.getActivity(context, UNIQUE_INT_PER_CALL, notificationIntent, 0);

les intentions ne sont pas créées si vous envoyez les mêmes paramètres. Ils sont réutilisés.

235
IncrediApp

Sinon, vous pouvez utiliser le code suivant pour générer votre PendingIntent:

PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);

De la doc pour PendingIntent.FLAG_UPDATE_CURRENT:

Si le PendingIntent décrit existe déjà, conservez-le, mais remplacez ses données supplémentaires par le contenu de ce nouvel Intent. Cela peut être utilisé si vous créez des intentions où seuls les extras changent, et ne vous souciez pas du fait que les entités ayant reçu votre PendingIntent précédent pourront le lancer avec vos nouveaux extras même si elles ne leur sont pas explicitement données.

124
ChristophK

Vous passez le même identifiant. Dans ce genre de situation, créez un identifiant unique à partir du temps comme ceci:

int iUniqueId = (int) (System.currentTimeMillis() & 0xfffffff);

Et le mettre comme ceci:

PendingIntent contentIntent = PendingIntent.getActivity(getApplicationContext(),iUniqueId, intentForNotification, 0);
38
hderanga

Pour ceux qui recherchent la meilleure approche après longtemps, il vous suffit de passer le PendingIntent.FLAG_UPDATE_CURRENT comme dernier argument, comme indiqué ci-dessous.

PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);

vous n'avez même pas besoin de fournir un nouvel identifiant unique.

3
Gentle

Je voulais juste ajouter une autre option

 PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_IMMUTABLE);
0
pellucide

Votre code de demande est 0 pour toutes les notifications. Changer de ligne suivante:

PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);

Avec:

PendingIntent contentIntent = PendingIntent.getActivity(context, new Random().nextInt(), notificationIntent, 0);
0
Faisal Shaikh