PendingIntent
cancel()
API文档说:
取消当前有效的PendingIntent。只有拥有PendingIntent的原始应用程序才能取消它。
我不确定这个的含义。如果我从活动x
设置AlarmManager事件,如下所示:
PendingIntent pendingIntent;
Intent myIntent = new Intent(x.this, AlarmReciever.class);
myIntent.putExtra("task_uuid", task_uuid);
pendingIntent = PendingIntent.getBroadcast(x.this, 0, myIntent,0);
AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC, dateTime.getTimeInMillis(), pendingIntent);
我的问题是:我可以使用以下方式从活动y
取消待处理的意图吗
PendingIntent pendingIntent;
Intent myIntent = new Intent(y.this, AlarmReciever.class);
myIntent.putExtra("task_uuid", task_uuid);
pendingIntent = PendingIntent.getBroadcast(y.this, 0, myIntent,0);
AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
alarmManager.cancel(pendingIntent);
答案 0 :(得分:1)
当您设置闹钟时,您需要在PendingIntent中传递一个键值,它将区分不报警,应该是这样的
pendingIntent = PendingIntent.getBroadcast(x.this, key_value, myIntent,0);
SharedPreferences settings = context.getSharedPreferences("alarm", 0);
SharedPreferences.Editor editor = settings.edit();
editor.putBoolean(key, false);
editor.commit();
要取消相同的闹钟,您需要将key_values
保存在某些地方,您可以使用共享偏好设置。得到相同的密钥然后取消这样的警报
SharedPreferences settings = context.getSharedPreferences("alarm", 0);
Map<String,?> allNotifyIdsMap = settings.getAll();
if(allNotifyIdsMap!=null&&allNotifyIdsMap.isEmpty()==false)
{
for(String notifyId: allNotifyIdsMap.keySet())
{
boolean isCleared = settings.getBoolean(notifyId, false);
if(isCleared==false)
{
pendingIntent = PendingIntent.getBroadcast(y.this, key_value, myIntent,0);
AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
alarmManager.cancel(pendingIntent);
}
}
}
答案 1 :(得分:0)
简要概述
AlarmManager基本上通过在预定时间调用PendingIntent来调度基于时间的操作。因此,为了取消预定警报,您需要访问该PendingIntent。
在创建待处理意图 - 请求代码和标记
时,请务必注意这两个参数 PendingIntent.getBroadcast(context,REQUEST_CODE,intent, PendingIntent.FLAG_UPDATE_CURRENT);
这个简短的概述不足以理解AlarmManager。阅读有关AlarmManager和PendingIntent here
的更多信息<强>解决方案强>
即使在安排警报时无法访问使用的相同PendingIntent对象,也可以从应用程序内的任何位置取消计划的警报。您可以使用相同的请求代码和FLAG_NO_CREATE创建新的待处理意图,它将返回相同的PendingIntent对象。
/*
With FLAG_NO_CREATE it will return null if the PendingIntent doesnt already
exist. If it already exists it returns
reference to the existing PendingIntent
*/
PendingIntent pendingIntent=PendingIntent.getBroadcast(this,REQUEST_CODE,intent,PendingIntent.FLAG_NO_CREATE);
if (pendingIntent!=null)
alarmManager.cancel(pendingIntent);