通知通过旧的意图附加
我正在通过这个代码在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。