通知通过旧的意图附加

我正在通过这个代码在BroadcastReceiver中创build一个通知:

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中我可以从Intent-Bundle(例如1)中检索foo_id,

但是,如果另一个通知被触发,我再次点击它,活动仍然收到来自Intent-Bundle的“旧”值(1)。 我试图用clear()清除bundle,但是我收到了相同的效果。 我想我的代码是错的

您正在发送相同的请求代码,以便处理您的紧急情况。 改变这个:

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

至:

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

意图不会创build,如果你发送相同的参数。 他们被重用。

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

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

从文档PendingIntent.FLAG_UPDATE_CURRENT

如果所描述的PendingIntent已经存在,那么保留它,但用这个新的Intent中的内容replace它的额外数据。 如果你正在创build只有额外变化的意图,那么可以使用这个方法,并且不要在接收到你以前的PendingIntent的任何实体能够使用你的新的附加function来启动它,即使它们没有被明确地赋予它。

您正在传递相同的ID。 这样的情况就像这样做一个Unike id

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

并把它作为这个

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

对于长时间寻找最佳方法的人来说,所有你需要传递PendingIntent.FLAG_UPDATE_CURRENT作为最后一个参数,如下所示

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

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