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); 
相關問題