2010-12-03 72 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了。

希望它有帮助。

相关问题