取消取消AlarmManager事件

时间:2014-01-10 12:29:16

标签: android alarmmanager android-pendingintent

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);

2 个答案:

答案 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);
  • 请求代码 - 作为唯一标识符
  • 标志 - 定义PendingIntent
  • 的行为

这个简短的概述不足以理解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);