我正在制作重复闹钟。使用以下代码可以正常工作:
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);
答案 0 :(得分:3)
我在这里是个菜鸟。但我想如果你想取消闹钟,你必须使用完全相同的PendingIntent实例。这意味着“他们的行动,数据,类型,类和类别是相同的”,由filterEquals(Intent)定义。因此,您需要在此处使用相同的requestCode,而不是0.也许您可以使用列表来存储Notification ID,并迭代它们以取消所有警报。
答案 1 :(得分:0)
我认为,你应该使用相同的AlarmManager对象来取消alram并尝试使用相同的PendingIntent。