2013-04-14 40 views
4

我已經安排PendingIntentAlarmManager。當AlarmManager提供Intent時,我能夠getExtras()我最初發送的所有數據。如何獲取已掛起的PendingIntent的Intent附加項?

但是,有時我會在AlarmManager發生火災之前獲得其他數據,我想通過Intent。我的想法是,我只想得到Intent像我打算取消,但後來取消它後,更新的臨時演員,並與AlarmManager重新安排,就像這樣:

Intent i=new Intent(this, MyReceiver.class); 
Bundle b = i.getExtras(); 
PendingIntent pi=PendingIntent.getBroadcast(this, id,i, 0); 
if (b == null) b = i.getExtras(); // in case I can't get it before calling getBroadcast 
// now add a key to b, put it in a new intent, schedule it, and cancel the old one? 

我打電話getBroadcast()與與我先前安排的ID相同。唯一的問題是,當我撥打getExtras()時,它總是返回空值。這似乎是我經常看到的問題的反面,其中Intent將被緩存,這是不希望的。在這種情況下,其實我是想獲得緩存Intent並獲得價值它,因爲Intent正在等待它應該仍然存在。

我該怎麼做?

一對夫婦的想法,我有過和/或審判。一個圍繞Intent.fillIn()函數,我是否可以用它來表示它應該(或不應該)覆蓋額外信息,以便我可以檢索原始信息。

看遠一點,我看到PendingIntentwriteToParcel()。我可以用它來獲得附件Intent的附加內容嗎?我試圖在readParcel與readBundle: bad magic number失敗,異常:

PendingIntent pi=PendingIntent.getBroadcast(this, id,i, 0); 
Parcel out = Parcel.obtain(); 
pi.writeToParcel(out, 0); 
i.readFromParcel(out); 

我猜想,也許這是因爲我輸出PendingIntent而是試圖讀取它作爲一個Intent

另一種想法是,我可以調用PendingIntent上的send()使它立即交付,並通過一個新的Intent添加一個新密鑰。然後在處理程序中,我將不得不迭代所有意圖附加關鍵字。如果還沒有進行實際處理,則需要重新發出PendingIntentAlarmManager

回答

3

好吧,我終於找到了解決這個問題的辦法。

這似乎並不可能得到來自PendingIntentIntent,但有可能在Intent傳遞給getBroadcast()添加額外 - 重要的是,最後一個參數,標誌,是零,使其將不會覆蓋現有的額外功能。

此外,附加項包含名稱/值對,添加的新密鑰與現有的Intent中的密鑰不匹配非常重要。這意味着removeExtra()必須在完成後調用以在下次之前清除密鑰。然後打電話send()上的PendingIntent針對自己,然後當收到意圖時可以訪問新的和舊的額外。然後可以將兩個附加物收集到新的Intent中,然後可以調用AlarmManager以重新安排時間。

+0

我在這裏面對的差不多:http://stackoverflow.com/q/31078345/406110 – Richard

4

試試這個

pi = PendingIntent.getBroadcast(this, id, i, 
         PendingIntent.FLAG_UPDATE_CURRENT) 

在這裏,我們要發送的PendingIntent.FLAG_UPDATE_CURRENT意圖標誌,如果同樣的PendingIntent存在,它將按原樣返回,否則一個新的PendingIntent將被退回。

請注意,當我們說意圖匹配時,URI,數據類型,類別將被匹配,而意圖額外會在匹配時被忽略。換句話說,IntentFilters將與兩種意圖匹配。

+1

沒有運氣。意圖中的額外內容仍然爲空。通過閱讀文檔,我懷疑發生了什麼事情是PendingIntent函數沒有返回傳入的Intent中的任何數據,他們只是將其採用。 – Michael

+2

PendingIntent.FLAG_UPDATE_CURRENT,它工作正常。 – Mejonzhan