如何获取和取消 PendingIntent?
Posted
技术标签:
【中文标题】如何获取和取消 PendingIntent?【英文标题】:How to get and cancel a PendingIntent? 【发布时间】:2011-05-19 21:02:33 【问题描述】:我有一个alarmManager
,用于在特定时间向用户发送通知。由于有多个警报,我有多个待定意图,我正在创建并提供唯一 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
标志是否需要与原始待处理意图的标志相匹配?
【问题讨论】:
FLAG_CANCEL_CURRENT
不会产生任何影响 - 要获得非常出色的分析,请参阅 this
【参考方案1】:
我发现您实际上并没有“获取”待处理的意图...您必须完全按照第一次创建它时的方式重新创建它(也包括意图),然后将其传递给 AlarmManager 的取消函数。所以我发布的上面的代码真的不是不正确的,只要我第一次创建它就是这样。希望有人会觉得这很有帮助。
【讨论】:
我遇到了你提到的同样的问题。你能简要解释一下我该如何克服这个问题。如果可能,您能否提供用于创建和取消挂起意图的 sn-p 代码。 试试这个答案:***.com/questions/9823408/cancelling-a-pendingintent 如果由于我不知道唯一 ID 并且警报已被删除而无法重新创建待处理意图怎么办?我该怎么做才能删除此笔意图。我感觉有一个警报在被删除后仍然处于活动状态。 我遇到了类似的问题。除了通过警报管理器取消 PI 之外,我还做了 pi.cancel @JenniferG 待定意图的第二个参数是您识别它的位置。通过在 INTENT 中传递待处理意图的“id”以及一揽子额外内容,您的接收器将在每次触发时拥有待处理意图的唯一 id。或者,如果您不在接收器内,那么您可以删除所有接近警报并重新创建它们(我想基于更新的数据)。【参考方案2】:有一个创建和取消警报的测试实现示例。
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);
需要三样东西,
相同类型的意图(在本例中,我们讨论的是 AlarmManager)。 相同的 PendingIntent ID(保留 id 的引用,以某种方式保存)。 一个正确的标志(FLAG_CANCEL_CURRENT 用于取消,不需要也不能完全是您在创建挂起意图时使用的标志[因为我们使用取消标志进行 calcel,但不创建。 ])更多详情请查看this。
希望对你有帮助。
【讨论】:
以上是关于如何获取和取消 PendingIntent?的主要内容,如果未能解决你的问题,请参考以下文章
如何告诉 PendingIntent 是创建新广播还是更新现有广播
PendingIntent 上使用的“requestCode”是啥?