【问题标题】:cancel all the alarms set using alarmmanager取消使用alarmmanager设置的所有闹钟
【发布时间】:2014-12-24 13:34:16
【问题描述】:

我想取消所有设置的警报.....我已经搜索了很多并尝试了很多东西但没有任何效果...当我在 2 分钟后设置警报然后我取消它时, 2分钟后它仍然会发射...... 任何帮助将不胜感激。

创建警报的方法:

Intent intent = new Intent(c, AlarmReceiver.class);
    intent.putExtra("task", task);
    intent.putExtra("id", id);
    PendingIntent pendingIntent = PendingIntent.getActivity(c, code, intent, PendingIntent.FLAG_CANCEL_CURRENT);
    AlarmManager am = (AlarmManager)c.getSystemService(Context.ALARM_SERVICE);
    am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);

这是取消警报:

    Intent intent = new Intent(c, AlarmReceiver.class);
    PendingIntent pendingIntent = PendingIntent.getActivity(c, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
    AlarmManager am = (AlarmManager)c.getSystemService(Context.ALARM_SERVICE);
    am.cancel(pendingIntent);

【问题讨论】:

  • 是否将PendingIntent.getActivity 替换为PendingIntent.getBroadcastPendingIntent.FLAG_CANCEL_CURRENT 替换为0 工作?
  • 使用 getBroadcast,没有任何警报触发(因为我的警报调用的是活动,而不是广播)......使用 FLAG_CANCEL_CURRENT 不起作用......我已经尝试过了。

标签: android


【解决方案1】:

当您安排闹钟时,getActivity() 的第二个参数是 code

当您尝试取消警报时,getActivity() 的第二个参数是 0。这只会成功取消code0 的警报。

如果您想始终取消警报,则需要创建等效的PendingIntents,这意味着除其他外,getActivity() 的第二个参数必须相同。

【讨论】:

  • 非常感谢您的回复。我明白了这个概念。但是我必须设置多个警报,因此 getActivity() 具有相同的第二个参数将替换旧警报而不是创建新警报。我该如何克服呢?
  • 设置多个报警,循环内的变量代码使用多个值即可。
  • @HirakChhatbar:“我该如何克服这个问题?” -- 跟踪您正在使用的代码,然后在创建PendingIntent 时使用相同的代码来替换或取消警报。
  • @CommonsWare - 我最终创建了一个单独的活动来取消警报,我将在其中传递要删除的警报代码,然后使用该代码将其删除.....谢谢寻求帮助
  • 当我重新创建 pendingIntent 时,我传递给我的意图并发送给 pendingIntent 的额外内容会发生变化。这就是我的闹钟不取消的原因吗?
【解决方案2】:

您正在使用请求代码(getActivity 的第二个参数)设置警报等于code,而当您取消警报时,第二个参数是0。如果code的值不是0,则报警不会被取消。

为了触发和取消多个警报,您需要在PendingIntent.getActivity 中为requestCode(第二个参数)使用唯一值

查看此代码,该代码将使用三个唯一的请求代码设置 3 个警报,

for (int requestCode = 1; requestCode <= 3; requestCode++) {
            PendingIntent pendingIntent = PendingIntent.getActivity(c, requestCode, intent,PendingIntent.FLAG_CANCEL_CURRENT);
           AlarmManager am = (AlarmManager)c.getSystemService(Context.ALARM_SERVICE);
           am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
        }

您可以使用与设置警报相同的requestCode(和其他参数)取消警报。

其他需要匹配的参数是,

  • Intent 中的“动作”必须相同(或均为空)。否则它们不匹配。
  • Intent 中的“数据”必须相同(或均为空)。否则它们不匹配。
  • Intent 中的(数据的)“类型”必须相同(或两者均为空)。否则它们不匹配。
  • Intent 中的“包”和/或“组件”必须相同(或均为空)。否则它们不匹配。 “包”和“组件”字段设置为“显式”Intents。
  • Intent 中的“类别”列表必须相同。否则它们不匹配。

更多详情请查看this answer

【讨论】:

    【解决方案3】:

    要取消警报,您无需重新创建相同的 PendingIntent 并传递相同的请求代码。

    你可以看到我的解决方案here

    【讨论】:

      【解决方案4】:

      当你取消闹钟时,它的意图必须与设置闹钟的意图相同。

      所以只需添加以下 2 行

      intent.putExtra("task", task);

      intent.putExtra("id", id);

      所以你的最终代码将是

      Intent intent = new Intent(c, AlarmReceiver.class);
      intent.putExtra("task", task);
      intent.putExtra("id", id);
      PendingIntent pendingIntent = PendingIntent.getActivity(c, code, intent, PendingIntent.FLAG_CANCEL_CURRENT);
      AlarmManager am = (AlarmManager)c.getSystemService(Context.ALARM_SERVICE);
      am.cancel(pendingIntent);
      

      【讨论】:

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