Android:无法取消重复闹钟

时间:2012-02-02 14:12:02

标签: android alarmmanager

我正在制作重复闹钟。使用以下代码可以正常工作:

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

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