我有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
标志是否需要与原始待定意图的标志相匹配?
答案 0 :(得分:59)
我发现你实际上并没有“获得”待处理的意图......你必须完全像你第一次创建它时那样重新创建它(Intent也是如此),然后将它传递给AlarmManager的取消功能。所以我发布的上述代码实际上并不正确,只要这是我第一次创建它。希望有人会觉得这很有用。
答案 1 :(得分: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件事,
有关详细信息,请查看this。
希望它有所帮助。