2011-08-15 76 views
1

我會盡我所能解釋這一點。基本上,我有活動1使用ExternalClass做各種事情。活動2還引用了所述外部類的活動1的對象。從這兩個活動中,我可以使用AlarmManager設置警報,但是我希望能夠取消從活動1中的任一活動創建的所有警報。Android:從另一個活動取消鬧鐘設置

所有警報均使用相同的意圖和相同的AlarmManger(都是在ExternalClass中創建的),但是當我在Activity 1中單擊我應該調用myAlarms.cancel(intent)的按鈕時,它只會取消使用Activity 1類創建的警報。

ExternalClass在Activity 2中通過引用在Activity 1中創建的那個類的對象引用,所以它們都應該使用ExternalClass的同一個實例。我很確定它不會取消警報,因爲設置警報時使用了上下文,但我無法弄清楚如何解決這個問題。

回答

5

爲了解決這個問題,我用下面的代碼:

timerAlarmIntent = PendingIntent.getBroadcast(myContext, i, alarmIntent, 0); 
ArrayList<PendingIntent> intentArray = new ArrayList<PendingIntent>(); 
intentArray.add(timerAlarmIntent); 
myAM.set(AlarmManager.RTC_WAKEUP, alarmTime, timerAlarmIntent); 

我的requestCode設置爲一個唯一的ID。這是在for循環內,我代表0,1,2 ...

要取消警報,我不得不將每個警報添加到列表中,並且當我想要取消所有警報時,循環顯示列表。

private void cancelAlarms(){ 
if(intentArray.size()>0){ 
    for(int i=0; i<intentArray.size(); i++){ 
     myAM.cancel(intentArray.get(i)); 
    } 
    intentArray.clear(); 
} 

}

+0

hi ryandlf如何在警報管理器列表中提前一個鬧鐘?thanx – shyam

2

要取消併發出警報,您需要將等效的PendingIntent(意爲p1.equals(p2)返回true)傳遞給用於創建它的程序。從創建AlarmManager參考的位置開始並不重要。在兩種情況下,你如何初始化PendingIntent

如果兩個PendingIntents都代表與 相同包的操作相同,則認爲兩個PendingIntents相同。基本上,如果您初始化兩個PendingIntents具有相同的Intents,它們將被視爲相等。編輯:文檔顯然是錯誤的,requestCode也用於比較PendingIntents。查看評論和其他答案。

+0

通過 「相同」 他的意思是一個 「等於」。它不必是具有相同屬性的參考。 – user123321

+0

對,謝謝。編輯(希望)使其更清晰。 –

+0

你是對的,謝謝!我的問題是我正在設置唯一的請求代碼。 – ryandlf