Android:无法取消重复闹钟

发布于 2025-01-01 08:28:26 字数 1714 浏览 1 评论 0原文

我正在创建一个重复警报。使用以下代码可以正常工作:

Intent intent = new Intent(this.ctx, AlarmReceiver.class);
intent.setAction("" + notificationId);
intent.putExtra(AlarmReceiver.TITLE, alarmTitle);
intent.putExtra(AlarmReceiver.SUBTITLE, alarmSubTitle);
intent.putExtra(AlarmReceiver.TICKER_TEXT, alarmTicker);
intent.putExtra(AlarmReceiver.NOTIFICATION_ID, notificationId);

 PendingIntent sender = PendingIntent.getBroadcast(this.ctx, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
 AlarmManager am = getAlarmManager();
 am.setRepeating(AlarmManager.RTC_WAKEUP, triggerTime, 60000, sender);

现在我想取消现有的通知消息(出于测试目的每分钟弹出一次),我调用以下代码,向其传递相同的 notificationId:

Intent intent = new Intent(this.ctx, AlarmReceiver.class);
intent.setAction("" + notificationId);
PendingIntent pi = PendingIntent.getService(this.ctx, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);

     AlarmManager am = getAlarmManager();
     try {
          am.cancel(pi);

         } catch (Exception e) {
       Log.e(PLUGIN_NAME, "AlarmManager update was not canceled. " + e.toString());
}

我看到 pi != null,但是通知不断出现并且没有被取消。两个代码片段都位于同一个类中。

基本上我有两个问题: - 如何使用其唯一 ID 取消单个警报? - 无论 ID 如何,如何取消所有警报?

更新:我发现在这里发布我的问题有助于理清我的思路。将取消代码从:

PendingIntent sender = PendingIntent.getService( ... )

更改为:

PendingIntent sender = PendingIntent.getBroadcast( ... )

有助于解决问题 1。但是取消所有事件的代码仍然不起作用:

Intent intent = new Intent(this.ctx, AlarmReceiver.class);
PendingIntent pi = PendingIntent.getBroadcast(this.ctx, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);

AlarmManager am = getAlarmManager();
am.cancel(pi);

I am creating a repeating alarm. This works fine using the following code:

Intent intent = new Intent(this.ctx, AlarmReceiver.class);
intent.setAction("" + notificationId);
intent.putExtra(AlarmReceiver.TITLE, alarmTitle);
intent.putExtra(AlarmReceiver.SUBTITLE, alarmSubTitle);
intent.putExtra(AlarmReceiver.TICKER_TEXT, alarmTicker);
intent.putExtra(AlarmReceiver.NOTIFICATION_ID, notificationId);

 PendingIntent sender = PendingIntent.getBroadcast(this.ctx, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
 AlarmManager am = getAlarmManager();
 am.setRepeating(AlarmManager.RTC_WAKEUP, triggerTime, 60000, sender);

Now I want to cancel an existing notification message (which pops up every minute for testing purposes), I invoke the following code, passing it an identical notificationId:

Intent intent = new Intent(this.ctx, AlarmReceiver.class);
intent.setAction("" + notificationId);
PendingIntent pi = PendingIntent.getService(this.ctx, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);

     AlarmManager am = getAlarmManager();
     try {
          am.cancel(pi);

         } catch (Exception e) {
       Log.e(PLUGIN_NAME, "AlarmManager update was not canceled. " + e.toString());
}

I see that pi != null, however the notification keeps coming and is not being cancelled. Both code snippets reside in the same class.

Basically I have two questions:
- How can I cancel a single alarm using its unique ID?
- How can I cancel all alarms, regardless of the ID?

UPDATE: I found that posting my issue here helps to get my mind straight. Changing the cancel code from:

PendingIntent sender = PendingIntent.getService( ... )

To:

PendingIntent sender = PendingIntent.getBroadcast( ... )

Helps to solve question 1. However the code to cancel all events, still does not work:

Intent intent = new Intent(this.ctx, AlarmReceiver.class);
PendingIntent pi = PendingIntent.getBroadcast(this.ctx, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);

AlarmManager am = getAlarmManager();
am.cancel(pi);

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

心凉 2025-01-08 08:28:26

我是这里的菜鸟。但我认为如果你想取消警报,你必须使用完全相同的 PendingIntent 实例。这意味着“它们的操作、数据、类型、类和类别是相同的”,如 filterEquals(Intent) 所定义。因此,您需要在此处使用相同的 requestCode,而不是 0。也许您可以使用列表来存储通知 Id,并迭代它们以取消所有警报。

I'm a noob here. But I think if you want to cancel the alarm, you have to use the exact same instance of PendingIntent. That means "their action, data, type, class, and categories are the same" as defined by filterEquals(Intent) . Therefore, you need to use the same requestCode here, not 0. Maybe you could use a list to store the Notification Ids, and iterate them to cancel all alarms.

痴意少年 2025-01-08 08:28:26

我认为,您应该使用相同的 AlarmManager 对象来取消警报,并尝试使用相同的 PendingIntent。

I think , you should use same AlarmManager object to cancel the alram and also try to use same PendingIntent.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文