La Notificación pasa los Extras de Intención antiguos


Estoy creando una notificación dentro de un BroadcastReceiver a través de este código:

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);

Cuando hago clic en la notificación, se abre la NotificationActivity y dentro de la Actividad puedo recuperar el foo_id del Paquete Intent (por ejemplo, 1)

Sin embargo, si se activa otra notificación y hago clic en ella de nuevo, la actividad todavía recibe el valor "antiguo" (1) del Paquete de intenciones. He intentado borrar el paquete con clear (), pero estoy recibiendo el mismo efecto. Creo que sth es mal con mi código..

Author: Sujatha Girijala, 2011-09-10

5 answers

Está enviando el mismo código de solicitud para sus intens pendientes. Cambiar esto:

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

A:

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

Las Intents no se crean si envía los mismos parámetros. Se reutilizan.

 217
Author: IncrediApp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-10 08:06:29

Alternativamente, puede usar el siguiente código para generar su PendingIntent:

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

Del doc para PendingIntent.FLAG_UPDATE_CURRENT:

Si el PendingIntent descrito ya existe, entonces guárdelo pero reemplace sus datos adicionales con lo que está en esta nueva Intent. Esto se puede usar si estás creando intents donde solo cambian los extras, y no te importa que cualquier entidad que haya recibido tu PendingIntent anterior pueda lanzarlo con tus nuevos extras incluso si no están explícitamente dado a ella.

 122
Author: ChristophK,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-02-17 14:38:39

Estás pasando el mismo ID. En este tipo de situación, haga un id único de tiempo como este:

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

Y ponlo así:

PendingIntent contentIntent = PendingIntent.getActivity(getApplicationContext(),iUniqueId, intentForNotification, 0);
 36
Author: hderanga,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-20 07:58:56

Para cualquiera que busque el mejor enfoque después de mucho tiempo, todo lo que necesita para pasar el PendingIntent.FLAG_UPDATE_CURRENT como último argumento como se muestra a continuación

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

Ni siquiera necesita proporcionar un nuevo id único.

 3
Author: Gentle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-11 12:29:04

Su código de solicitud es 0 para toda la notificación. Cambiar la línea siguiente:

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

Con:

PendingIntent contentIntent = PendingIntent.getActivity(context, new Random().nextInt(), notificationIntent, 0);
 0
Author: Faisal Shaikh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-04 09:03:14