92

我正在通过这个代码创建一个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和活动中,我可以检索的意图foo_id捆绑(例如1)

但是,如果另一个通知被触发,我再次点击它,该活动仍然收到来自意向捆绑的“旧”值(1)。我尝试用clear()清除捆绑包,但收到相同的效果。我认为......我的代码有问题..

+0

请你能告诉我你是怎么从挂起的意图 – user49557

+0

认识到,它是发送旧演员,让我更容易优先分配获取数据。 –

回答

187

您正在为您的待定集中区发送相同的请求代码。如果您发送相同的PARAMS

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

意图不是创造: 更改此:

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

要。它们被重用。

+0

所以UNIQUE_INT_PER_CALL是我必须提供的整数?或者这是一个静态变量声明的地方? – BrianM

+0

您必须提供的唯一整数 – IncrediApp

+6

android gotcha#147 - 所以具有*不同* extras(通过'putExtra')的'Intent'被认为是相同的并且被重用,因为我没有为某个未决意图提供唯一的ID电话 - 糟糕的API – wal

116

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

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

从文档的PendingIntent.FLAG_UPDATE_CURRENT

如果所描述的PendingIntent已经存在,然后继续,但替换其额外数据与这个新的Intent中的内容。如果你正在创建只有额外变化的意图,可以使用它,并且不关心任何接收你以前的PendingIntent的实体将能够使用你的新的额外功能启动它,即使它们没有被明确地赋予它。

+0

谢谢!有这个问题,这是 –

+0

这对于大多数应用来说似乎是一个比以前更好的解决方案 –

+0

它像一个魅力一样工作,非常感谢你christoph – praveenb

34

您正在传递相同的ID。这种情况使Unike ID从时间这样

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

并把它作为这个

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

为什么不使用新的随机()nextInt() – exloong

+0

这个解决方案的实际工作。 –

+0

对于捆绑通知,此解决方案有效。 – User12111111

3

为寻找很长一段时间后,最好的办法都需要通过的PendingIntent。 FLAG_UPDATE_CURRENT作为最后一个参数如下图所示

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

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

0

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

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

有了:

PendingIntent contentIntent = PendingIntent.getActivity(context, new Random().nextInt(), notificationIntent, 0); 
相关问题