android 取消使用AlarmManager设置的所有闹钟

gr8qqesn  于 2023-04-18  发布在  Android
关注(0)|答案(4)|浏览(541)

我想取消所有设置的闹钟。我已经搜索了很多,尝试了很多东西,但都没有工作。当我设置了一个闹钟说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);

任何帮助将不胜感激。

wswtfjt7

wswtfjt71#

当您安排闹钟时,getActivity()的第二个参数是code,当您尝试取消闹钟时,getActivity()的第二个参数是0。这将仅成功取消code0的闹钟。
如果你想“一致地”取消闹钟,你需要创建等价的PendingIntents,这意味着相同的Intent对象(具有相同的动作,组件,数据,标志和其他属性)和相同的代码。值得一提的是,你用来创建IntentContext不需要相同,取消也会看到它是相同的。

pgky5nke

pgky5nke2#

您设置的报警请求码(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中的“action”必须相同(或都为null)。否则它们不匹配。
  • Intent中的“data”必须相同(或都为null)。否则它们不匹配。
  • Intent中的(数据的)“type”必须相同(或都为null)。否则它们不匹配。
  • Intent中的“package”和/或“component”必须相同(或都为null)。否则它们不匹配。“package”和“component”字段是为“explicit”Intent设置的。
  • Intent中的“categories”列表必须相同。否则它们不匹配。

请参阅this answer了解更多详情。

wf82jlnq

wf82jlnq3#

要取消警报,您不需要重新创建相同的PendingIntent并传递相同的请求代码。
你可以在这里看到我的解决方案

vnzz0bqm

vnzz0bqm4#

当您取消报警时,其意图必须与用于设置报警的意图相同。
因此只需添加以下两行
Intent.putExtra(“任务”,任务);
int n. getString(“nums”,nums);
所以你的最终代码是

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

相关问题