2010-06-09 169 views
72

我的應用程序中有一個鬧鐘事件,它會啓動一個通知,然後當按下時啓動一個活動。 問題是,當我創建多個警報時,從通知啓動的活動獲得與第一個相同的額外資源。我認爲這個問題要麼是出於意圖,而是出於待決意圖或待決意圖本身。我想我可能需要在其中的一個上放一個標誌,但我不知道哪一個。android等待意圖通知問題

Intent showIntent =new Intent(context, notificationreceiver.class); 
    showIntent.putExtra("details", alarmname); 

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

    notification.setLatestEventInfo(context, "The event is imminent", 
      alarmname, contentIntent); 

和通知

Bundle b = getIntent().getExtras(); 
    String eventname = b.getString("details"); 
    details.setText(eventname); 

「詳細資料」的接收額外是相同的,下一次的通知發生,而不是具有不同價值的每一個。 直到我設定意圖,我相信正確的價值去「細節」,所以它每次我按任何通知時獲得第一個意圖的問題。 我如何才能啓動正確的意圖? 希望我儘可能清楚 謝謝!

+0

我做了什麼因爲我使用唯一的notificationId來跟蹤狀態(狀態欄通知),所以我使用相同的變量傳入我的PendingIntent中,從而使其具有唯一性。 – 2011-08-16 22:11:48

回答

68

的問題是,當我創造更多 多個報警,然後從通知發佈活動 得到 同爲演員的第一個。

正確。

我該如何使其啓動 正確的意圖?

這取決於您是否有兩個報警將立即註冊或不存在。

如果不是,您可以use FLAG_ONE_SHOT or one of the other PendingIntent flags讓您的第二個PendingIntent使用更新的演員。

但是,如果你將有一次註冊了兩個報警器,具有不同的Intent演員,你將需要兩個Intents比較兩個時更加重大差異,使得filterEquals()回報false。例如,您可以撥打setData()setAction(),併爲每個Intent提供不同的值。

+2

男士非常感謝您的幫助。因爲可能有警報在一起,並且在通知欄上有多個通知,所以我使用FLAG_UPDATE_CURRENT標誌作爲掛起的意圖。 但是,真正的交易就像你說的用行動警報名稱設置行動的意圖,現在它可以知道哪些意圖是不同的以及相同的意圖。 再次感謝! – spagi 2010-06-10 00:42:57

+2

setAction也適用於我。我只是想知道爲什麼官方的SDK沒有提到它。 – 2011-01-23 05:07:21

+0

setAction的作品,謝謝TON。使用setAction幫助我區分所有pendingIntents,非常棒! – Soham 2011-11-03 06:54:48

116

我解決了這個問題的方法是通過分配一個唯一的requestCode當你得到的PendingIntent:

PendingIntent.getActivity(context, requestCode, showIntent, 0); 

這樣,你與不同的系統/唯一意圖實例註冊。 提示:使requestCode唯一的一個好方法是將當前系統時間傳遞給它。

int requestID = (int) System.currentTimeMillis(); 
+9

requestCode確實沒有被任何東西使用,但它確實使意圖具有唯一性,從而避免它們被覆蓋!優秀的工作u-ramos! – Kitteh 2012-01-17 11:55:50

+1

即使使用了'TaskStackBuilder',我們也有一個方法'getPendingIntent(int requestCode,int flags)'。這裏可以傳遞這個requestID。 – 2013-11-11 07:20:09

+1

小心,currentTimeMillis類型是long,所以如果你轉換爲int,它將被截斷。 我不知道有多可能,如果有關係,但可以重複。 在這種情況下,您可以使用靜態遞增值 – djpeinado 2014-02-06 13:36:59

1

另一種解決方案:

使用的PendingIntent。FLAG_UPDATE_CURRENT這樣的:

PendingIntent contentIntent = PendingIntent.getActivity(this, 0,i, PendingIntent.FLAG_UPDATE_CURRENT); 

這個工作對我來說

+0

這不起作用。它取代了舊的參數並取代了新的參數 – 2015-10-12 19:49:16

0

我在我的應用程序有這個問題,只是產生的隨機數超過來重寫通知意向:

int random= new Random().nextInt(); 
PendingIntent resultPendingIntent = 
     stackBuilder.getPendingIntent(
       random, 
       PendingIntent.FLAG_UPDATE_CURRENT 
    );