通知传递旧的意图附加值

我通过以下代码在 BroadcastReceiver 中创建一个通知:

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

当我点击通知时,它会打开 NotificationActivity,在 Activity 里面我可以从意图包中检索 foo _ id (例如1)

但是,如果触发了另一个通知,我再次单击它,活动仍然从 Inent-Bundle 接收到“ old”值(1)。我尝试用 clear ()来清除 bundle,但是收到了同样的效果。我认为我的代码有问题。.

28537 次浏览

您正在为您的未决意图发送相同的请求代码。 改变这一点:

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

致:

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

如果发送相同的参数,则不会创建相同的意图。

或者,您可以使用以下代码来生成您的 PendingInent:

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

来自 PendingIntent.FLAG_UPDATE_CURRENT的医生:

如果所描述的 PendingInent 已经存在,那么保留它,但是用新意图中的内容替换其额外的数据。如果您创建的意图只有额外的变化,并且不在乎任何实体接收到您以前的 PendingInent 将能够启动它与您的新额外的,即使他们没有明确地给予它。

您传递的是相同的 ID。在这种情况下,从时间上创建一个惟一的 ID,如下所示:

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

这么说吧:

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

对于那些经过长时间寻找最佳方法的人来说,您需要传递 FLAG _ UPDATE _ CURRENT作为最后一个参数,如下所示

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

你甚至不需要提供一个新的唯一 id。

你需要在下一次做这件事,而不是第一次

所有通知的请求代码为0。更改以下代码行:

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

配合:

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

只是想增加一个选项

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