2010-12-03 64 views
23

我有一個alarmManager,我用它在特定的時間向用戶發送通知。由於存在多個警報,因此我創建了多個待處理的意圖,並提供了唯一的ID。但是,在某些情況下,我需要獲取所有待處理意圖,然後取消它們,以便重置警報。我已經嘗試過這樣做了,但我仍然無法做到,所以我有幾個問題:如何獲取和取消PendingIntent?

這是您如何正確取得和取消PendingIntent

Intent intent = new Intent(con, AppointmentNotificationReciever.class); 
PendingIntent sender = PendingIntent.getBroadcast(con, id, intent, 
     PendingIntent.FLAG_CANCEL_CURRENT); 
AlarmManager am = (AlarmManager) con.getSystemService(Context.ALARM_SERVICE); 
am.cancel(sender); 

意圖是否需要完全匹配原始未決意圖(extras和all)的意圖?

PendingIntent標誌是否需要匹配原始未決意圖的標誌?

+0

「FLAG_CANCEL_CURRENT」不會有什麼區別 - 對於一個非常出色的分析,請參閱[this](http://justanapplication.wordpress.com/tag/flag_cancel_current/#PendingIntentMatching) – 2013-05-26 13:49:16

回答

56

我發現你實際上並沒有「獲得」掛起的意圖......你必須重新創建它,就像它第一次創建它時(意圖一樣),然後將它傳遞給AlarmManager的cancel函數。所以我發佈的上面的代碼真的是不正確的,只要這是我第一次創建它。希望有人會發現這有幫助。

+0

我遇到了與您提到的相同的問題。你能簡單地解釋我怎樣才能克服這個問題。如果可能的話,您可以提供用於創建和取消待定意圖的代碼段代碼。 – 2013-01-10 08:00:30

1

有一個我創建和取消警報的測試實現的例子。

public void setTHEalarm(Calendar aCalendarToAlarm) { 
    int id; 
    Intent intent; 
    PendingIntent pendingIntent; 
    AlarmManager alarmManager; 

    //I create an unique ID for my Pending Intent based on fire time of my alarm: 

    id = Integer.parseInt(String.format("%s%s%s%s", 

      aCalendarToAlarm.get(Calendar.HOUR_OF_DAY), 
      aCalendarToAlarm.get(Calendar.MINUTE), 
      aCalendarToAlarm.get(Calendar.SECOND), 
      aCalendarToAlarm.get(Calendar.MILLISECOND))); //HASH for ID 

    intent = new Intent(this,AlarmReceiver.class); 
    intent.putExtra("id",id); //Use the id on my intent, It would be usefull later. 

    //Put the id on my Pending Intent: 
    pendingIntent = PendingIntent.getBroadcast(this,id,intent,0); 
    alarmManager = (AlarmManager) 

      this.getSystemService(Context.ALARM_SERVICE); 


    alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP,aCalendarToAlarm.getTimeInMillis(),CustomDate.INTERVAL_MINUTE,pendingIntent); 


    Log.w(TAG+" Torrancio","Created alarm id: " 
      +id+" -> " 
      +CustomDate.dateToHumanString(aCalendarToAlarm.getTime())); 

    //Keep a reference in a previously declared field of My Activity (...) 
    this.idSaved = id; 

} 

//Now for canceling 
public void setCancel() { 
    int id; 
    Intent intent; 
    PendingIntent pendingIntent; 
    AlarmManager alarmManager; 

    id = this.idSaved; 
    intent = new Intent(this,AlarmReceiver.class); 
    intent.putExtra("id",id); 
    pendingIntent = PendingIntent.getBroadcast(this,id,intent,PendingIntent.FLAG_CANCEL_CURRENT); 

    //Note I used FLAG_CANCEL_CURRENT 

    alarmManager = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE); 
    alarmManager.cancel(pendingIntent); 

    Log.w(TAG+" Torrancio","Canceled->"+id); 


} 

需要3個東西,

  • 同類型的意圖(這種情況下,我們正在談論的AlarmManager)。
  • Same PendingIntent ID(保留id的引用,以某種方式保存)。
  • 正確的標誌(FLAG_CANCEL_CURRENT取消,沒有必要和也必須完全創建的PendingIntent,當你使用一個[,因爲我們使用了取消標誌calcel,但不能創建。])

更多詳情請查看this了。

希望它有幫助。

相關問題