2013-02-23 68 views

回答

22

一旦你創建了一個新的PendingIntentFLAG_CANCEL_CURRENT,什麼都持有相同Intent以前PendingIntent將不再能夠執行該原始PendingIntent

例如,假設我們有這樣的:

Intent i=new Intent(this, Foo.class); 

i.putExtra("key", 1); 

PendingIntent pi=PendingIntent.getActivity(this, 0, i, 0); 

,我們使用PendingIntent有,比方說,一個Notification

後來,我們執行:

Intent i=new Intent(this, Foo.class); 

i.putExtra("key", 2); 

PendingIntent pi2=PendingIntent.getActivity(this, 0, i, PendingIntent.FLAG_CANCEL_CURRENT); 

在這一點上,獨創了PendingIntentpi)不再有效,而無論我們使用pi2用於將看到更新的額外價值(2)。

相反,如果我們這樣做:

Intent i=new Intent(this, Foo.class); 

i.putExtra("key", 2); 

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

在這一點上,pipi2都表示相同PendingIntent,都將看到更新的額外價值(2)。

或者,如果我們這樣做:

Intent i=new Intent(this, Foo.class); 

i.putExtra("key", 2); 

PendingIntent pi2=PendingIntent.getActivity(this, 0, i, 0); 

在這一點上,pipi2仍然代表同一PendingIntent,但演員是不變的,如getActivity()返回PendingIntent而不應用新的附加功能。

大多數情況下,FLAG_UPDATE_CURRENT是一個很好的答案,當您嘗試替換PendingIntent內部的臨時演員時。

+0

Intent i = new Intent(this,Foo.class); i.putExtra(「key」,1); PendingIntent pi = PendingIntent.getActivity(this,0,i,0); AlarmManager am = Context.getSystemService(Context.ALARM_SERVICE); am.set(ELAPSED_REALTIME,mTime,pi); Intent i = new Intent(this,Foo.class); i.putExtra(「key」,2); PendingIntent pi2 = PendingIntent.getActivity(this,0,i,PendingIntent.FLAG_CANCEL_CURRENT); am.set(ELAPSED_REALTIME,mTime1,pi2); am.set(ELAPSED_REALTIME,mTime1,pi2); 那麼,現在當鬧鐘管理器在時間mTime到期時,掛起的意圖pi將不會被調用? – pikini 2013-02-24 14:38:14

+2

@pikini:我期望'PendingIntent.CanceledException'會被拋出。據推測,「AlarmManager」有處理這個問題的邏輯。但是,如果你想取消一個鬧鐘,最好調用'cancel()'而不是讓'AlarmManager'處理這個異常,恕我直言。 – CommonsWare 2013-02-24 14:40:40

+0

感謝您的回答。我會嘗試這樣做並分享我的結果。感謝您的時間回覆。 – pikini 2013-02-24 14:51:44