如何获取和取消PendingIntent?

我有一个alarmManager ,我用它在特定的时间向用户发送通知。 由于有多个警报,我有多个待处理的意图,我正在创build并给出一个唯一的ID,但是在某些情况下,我需要获取所有未决的意图,然后取消它们,所以我可以重置警报。 我已经尝试了他的,我似乎还没有得到正确的,所以我有几个问题:

这是你如何正确得到和取消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); 

意图是否需要完全匹配原始未决意图(额外和全部)?

PendingIntent标志是否需要匹配原始未决意图的标志?

Solutions Collecting From Web of "如何获取和取消PendingIntent?"

我发现你实际上并没有“获得”挂起的意图……你必须重新创build它,就像你第一次创build它(Intent)一样,然后把它传递给AlarmManager的cancel函数。 所以上面的代码我发布真的是不正确的,只要这是我第一次创build它。 希望有人会觉得这有帮助。

有一个我创build和取消警报的testing实现的例子。

  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件事情,

  • 相同types的意图(这种情况下我们正在谈论一个AlarmManager )。
  • 同PendingIntent ID(保留一个id的引用,保存一些方式)。
  • 一个正确的标志( FLAG_CANCEL_CURRENT用于取消,不需要也不一定是您创buildpendingintent时使用的标志 [ 因为我们使用calcel的cancel标志,但不创build。 ])

欲了解更多详情,请查看。

希望能帮助到你。