首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >取消AlarmManager事件

取消AlarmManager事件
EN

Stack Overflow用户
提问于 2014-01-10 12:29:16
回答 2查看 444关注 0票数 2

PendingIntent cancel() API文档说:

取消当前活动的PendingIntent。只有拥有PendingIntent的原始应用程序才能取消它。

我不知道这是什么意思。如果我将活动AlarmManager事件设置为以下x

代码语言:javascript
复制
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的待定意图:

代码语言:javascript
复制
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);
EN

回答 2

Stack Overflow用户

发布于 2014-01-10 12:36:36

当您设置告警时,您需要在PendingIntent中传递一个键值,它将区分没有警报,应该是这样

代码语言:javascript
复制
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保存在某个位置,您可以使用共享首选项。得到相同的键,然后像这样取消警报

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2018-05-05 11:20:49

概述

AlarmManager基本上通过在预定时间调用PendingIntent来调度基于时间的操作。因此,为了取消预定的警报,您需要访问该PendingIntent。

始终注意这两个参数,同时创建挂起的意图-请求代码和国旗

代码语言:javascript
复制
 PendingIntent.getBroadcast(context,REQUEST_CODE,intent, PendingIntent.FLAG_UPDATE_CURRENT);
  • 请求代码-充当唯一标识符
  • 标志-定义PendingIntent的行为

这个简短的概述不足以理解AlarmManager。阅读有关AlarmManager和PendingIntent 这里工作的更多信息

溶液

您可以在应用程序中的任何地方取消预定的警报,即使在调度警报时没有访问同一个PendingIntent对象的权限。您可以使用相同的请求代码和FLAG_NO_CREATE创建一个新的挂起的意图,它将返回相同的PendingIntent对象。

代码语言:javascript
复制
/*
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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21044441

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档