【问题标题】:Canceling an alarm in AlarmManager在 AlarmManager 中取消警报
【发布时间】:2013-10-08 05:45:49
【问题描述】:

在我的代码中,我创建了一个警报如下:

AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent i = new Intent("mypackage.START_MONITORING_SERVICE");
PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);
long timeForNextStart = System.currentTimeMillis() + elapsedTime;
am.set(AlarmManager.RTC_WAKEUP, timeForNextStart, pi);

要取消闹钟,我这样做:

AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent("mypackage.START_MONITORING_SERVICE");
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
am.cancel(pendingIntent);

我的问题是,这是否是取消所有具有相同意图的警报的正确方法。文档说:

删除任何具有匹配 Intent 的警报。任何警报,任何类型, 其 Intent 与此匹配(由 filterEquals(Intent) 定义), 将被取消。

我不确定是什么定义了“匹配意图”。如果我用上面的代码创建了多个警报,然后如图所示执行取消,它会取消我创建的所有警报吗?

【问题讨论】:

    标签: android alarmmanager


    【解决方案1】:

    你应该使用PendingIntent标志==> PendingIntent.FLAG_CANCEL_CURRENT第四个参数创建pendingIntent实例方法。

    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent,PendingIntent.FLAG_CANCEL_CURRENT);
    

    【讨论】:

      【解决方案2】:

      试试这个

      AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
      
          Intent updateServiceIntent = new Intent(context, MyPendingIntentService.class);
          PendingIntent pendingUpdateIntent = PendingIntent.getService(context, 0, updateServiceIntent, 0);
      
          // Cancel alarms
          try {
              alarmManager.cancel(pendingUpdateIntent);
          } catch (Exception e) {
              Log.e(TAG, "AlarmManager update was not canceled. " + e.toString());
          }
      

      【讨论】:

        【解决方案3】:

        我的问题是这是否是取消所有警报的正确方法 相同的意图?

        我不知道您是否知道requestCode 对于每个pendingIntent 应该是唯一的,以用于以下语法

        public static PendingIntent getService (Context context, int requestCode, Intent intent, int flags)
        

        我不确定什么定义了“匹配意图”。

        每个待处理的意图映射及其提供的触发意图以及每个请求代码映射具有该意图。

        我们可以说两个不同的pendingIntent 可以是相同的requestcode,理想情况下有两个不同的intents

        记住,这里如果PendingIntent 有相同的requestCode 对应相同的intent,那么可以根据int flags 覆盖或取消它

        如果我使用上述代码创建多个警报,然后执行 取消如图所示,它会取消我创建的所有警报吗?

        要创建多个警报,您必须为不同的 requestCode 提供相同的 intent 。 如果你想取消那些创建的警报,那么你必须根据requestCode取消它们

        例如

        To Create :
        
        AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        For (int i= 0 ; i <5 ; i++){
        PendingIntent contentIntent = PendingIntent.getBroadcast(TaskReminder.this, i,
                                    new Intent(),PendingIntent.FLAG_UPDATE_CURRENT);
         alarmManager.set(AlarmManager.RTC_WAKEUP, timeForNextStart, contentIntent);
        
        }
        
        To cancel :
        
        For (int i= 0 ; i <5 ; i++){
        //Note here ' i ' is the requestCode which map each pendingIntent with there provided intent 
        PendingIntent contentIntent = PendingIntent.getBroadcast(TaskReminder.this, i,
                                    new Intent(),PendingIntent.FLAG_UPDATE_CURRENT);
         alarmManager.cancel(contentIntent);
        
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多