129 votes

La notification passe l'ancienne intention Extras

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, cela ouvre l'activité NotificationActivity et dans cette activité, je peux récupérer le foo_id de l'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 l'"ancienne" valeur (1) de l'Intent-Bundle. J'ai essayé d'effacer le bundle avec clear(), mais je reçois le même effet. Je pense que quelque chose ne va pas avec mon code

259voto

IncrediApp Points 5800

Vous envoyez le même code de demande pour vos intensités en attente. Changez ça :

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

A :

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

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

133voto

ChristophK Points 1108

Vous pouvez également utiliser le code suivant pour générer votre PendingIntent :

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

Extrait du document pour PendingIntent.FLAG_UPDATE_CURRENT :

Si le PendingIntent décrit existe déjà, il est conservé mais ses données supplémentaires sont remplacées par celles de ce nouvel Intent. Cela peut être utilisé si vous créez des intents où seuls les extras changent, et que vous ne vous souciez pas du fait que toutes les entités qui ont reçu votre PendingIntent précédent pourront le lancer avec vos nouveaux extras même s'ils ne lui sont pas explicitement donnés.

40voto

hderanga Points 548

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

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

Et mettez-le comme ceci :

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

9voto

Gentle Points 134

Pour tous ceux qui cherchent la meilleure approche après une longue période tout, vous devez passer le PendingIntent.FLAG_UPDATE_CURRENT (en anglais) 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.

Vous devez faire cela pour la prochaine fois et non pour la première.

0voto

Faisal Shaikh Points 966

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

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

Avec :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X