2010-09-09 102 views
10

我有一個提醒人們完成任務的應用程序。所以有一個PendingIntent,現在用戶可以在他想要的時候刪除鬧鐘。在這段代碼中,只有一個PendingIntent用於多個用戶警報,所以我很困惑取消那個特定的警報,其中的意圖額外是"pill"。其餘警報不應取消。我不知道這個問題。希望我清楚。由於取消AlarmManager的問題 - PendingIntent

Intent intent = new Intent(this, AlarmNotifyReceiver.class); 
intent.putExtra("Name_pill", "pill"); 
sender = PendingIntent.getBroadcast(this, 
DatabaseConstants.NOTIFICATION_ID + 1, intent, 
PendingIntent.FLAG_UPDATE_CURRENT); 
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE); 
am.set(AlarmManager.RTC_WAKEUP,cal.getTimeInMillis(), sender); 
updateTheFlag(pillName[(pillName.length-1)]); 
+2

我也在尋找與此問題類似的答案。我正在做與你非常相似的事情,但我似乎無法得到它的工作。我現在的理解是,你需要使用am.cancel(pendingIntent),這意味着你需要初始化一個相同的pendingIntent到你在這裏所做的。但是,這似乎並不適合我。任何能夠回答這個問題的人肯定會從我這裏得到讚揚:) – 2010-12-03 14:20:11

回答

5

正如我在我的評論說,看來,你只是需要重新創建完全相同的PendingIntent對象,並把同樣的附加進去。然後,您致電

am.cancel(sender); 

而您的具體報警應該取消。我個人無法找到更好的方法。我發現這些信息以確認我的期望elsewhere

它讀取:

重複報警必須取消阻止他們。 AlarmManager提供了一個cancel()方法,該方法需要與創建該intent的相同的intent類。這是您如何取消警報。

alarmManager.cancel(pendingIntent);

注意pendingIntent對象不需要是同一個對象。創建警報時,動作,班級,類別等意圖字段應該相同。意圖用於識別要取消它的警報。

這是在重複警報的情況下,但一次性警報應以同樣的方式取消,如果我沒有錯。我無法對自己進行更徹底的測試,因爲我在工作,但這應該起作用。

+2

根據Android文檔,爲了阻止警報,您應該創建一個具有相同數據的'Intent',但不一定是相同的額外參數:public void取消(PendingIntent操作) 刪除任何具有匹配意圖的警報。任何類型的意圖與其匹配的警報(由filterEquals(Intent)定義)將被取消。 – noloman 2011-08-28 08:33:11

10

按照Android文檔,以阻止報警時,您應該創建一個Intent使用相同的數據,但一定是相同的演員:

公共無效取消(的PendingIntent操作)

刪除任何具有匹配意圖的警報。任何類型的報警,其意圖匹配>>(由filterEquals(意圖)定義)將被取消。

filterEquals(Intent)

公共布爾filterEquals(意向其他)

確定是否兩個目的是意圖分辨率(濾波)的目的是相同的。 >即,如果他們的行爲,數據,類型,類別和類別相同。 這並不比較意圖中包含的任何額外數據。

+0

所以如果你有2個'PendingIntent',在不同的時間創建完成同樣的事情,應該用什麼來區分它們? – Michael 2017-07-27 18:43:00

1

我覺得在getBroadcast()requestCode參數需要被提及。我同意所有的警報將被取消與給定的意圖匹配。但是,當定義用於取消的PendingIntent時,可以通過使用唯一的requestCode來使鬧鐘唯一。因此,只有那些報警將被取消具有相同意圖requestCode

int TIMER_1 = 1; 
int TIMER_2 = 2; 
AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE); 
Intent i = new Intent(this, AppReciever.class); 
i.putExtra("timer", "one"); 
PendingIntent pending = PendingIntent.getBroadcast(this, TIMER_1, i, 
      PendingIntent.FLAG_CANCEL_CURRENT); 
Calendar cal = Calendar.getInstance(); 
am.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), pending); 

然後檢查的PendingIntent根據this存在:

PendingIntent pending1 = PendingIntent.getBroadcast(this, TIMER_2, i, 
       PendingIntent.FLAG_NO_CREATE); 
boolean alarmUp = (pending1 != null); 

alarmUp(注意FLAG_NO_CREATE用於不創建新的,如果不存在),所以嘗試使用相同requestCode

PendingIntent pending2 = PendingIntent.getBroadcast(this, TIMER_1, i, 
       PendingIntent.FLAG_NO_CREATE); 
alarmUp = (pending2 != null); 

alarmUp真正,正以嶄新的意圖試圖包含不同的附加:

Intent i2 = new Intent(this, AppReciever.class); 
i2.putExtra("timer", "two"); 
pending2 = PendingIntent.getBroadcast(this, TIMER_1, i2, 
       PendingIntent.FLAG_NO_CREATE); 
alarmUp = (pending2 != null); 

alarmUp真正以及自ii2是,儘管額外的相同是不是,所以現在你可以刪除這個報警:

am.cancel(pending2); 
0

所以有一個待定的意圖,現在用戶可以刪除阿拉姆當他想要 。 IB這段代碼只有一個用於 多個用戶報警掛起的意圖,所以我很困惑,進行抵消特定 報警,其中演員是丸

intent.putExtra("Name_pill", "pill"); 

額外不會不會工作,取消待處理的意圖。

pendingIntent.cancel()只會刪除該待處理意圖,該意圖觸發相同的filterEquals(Intent),並且該方法不比較任何額外的數據給意圖。

這是從Android的filterEquals(Intent)

開發人員網站上含有確定兩個意圖是意圖 分辨率(過濾)的目的是相同的。也就是說,如果他們的行爲,數據,類型,類別, 和類別是相同的。這不會比較意圖中包含的任何額外數據 。

如果我們考慮你的情況下,當你將傳遞Extra到意圖在那個時候,你只需要保存唯一的ID在一些sharedpreference的參數,它給出的一件事你應該記住,ID必須是一個獨特的。

並且當您想要取消該警報時,只需將相同的意圖傳遞給該保存的ID並取消該pendingintent即可。

創建

preference_saved_value = DatabaseConstants.NOTIFICATION_ID + 1 
sender = PendingIntent.getBroadcast(this, 
preference_saved_value, intent, 
PendingIntent.FLAG_UPDATE_CURRENT) 

取消

sender = PendingIntent.getBroadcast(this, 
preference_saved_value, intent,PendingIntent.FLAG_UPDATE_CURRENT); 
sender.cancel() 
0

因爲它等待與原意,即是等價按照Intent.filterEquals但有不同的要求意圖Android文檔中的既定代碼被認爲是不同的:

如果確實需要多個不同的PendingIntent在 對象處於活動狀態的時間(如兩個通知,它們都在同一時間顯示 使用),那麼你將需要確保有一些 是他們與他們不同 PendingIntents不同。這可以是由 Intent.filterEquals或提供給 的不同請求代碼整數所考慮的Intent屬性中的任意一個屬性getActivity(Context,int,Intent,int),getActivities(Context,int, Intent [],int),getBroadcast Context,int,Intent,int)或getService(Context,int,Intent,int)。

所以,你可以分配不同的請求代碼並對其取消掛起的意圖基地,忘了額外的費用。

有,我想通了,這種行爲的一個有趣場景:

我計劃在我的代碼報警,並在設備上運行,但從來沒有取消它。然後我更改了請求代碼並再次運行它。所以產生了一個新的警報。我取消了新的警報,但警報仍在執行之前的代碼。我很困惑,爲什麼警報沒有取消。當我發現它是從不同的請求代碼的以前的代碼我卸載應用程序,並再次安裝它,問題解決了。