Android AlarmManager 没有正确取消警报

Android AlarmManager not cancelling alarms correctly

我正在开发一款允许用户设置多个通知并取消他们选择的任何通知的应用程序。

我遇到的问题是,当我使用 AlarmManager 取消待定意图时,它会取消所有警报。我的每个待定意向都有自己唯一的请求代码。

例如,我会调用它来创建警报然后删除:

setAlarm(5062, 1453269670) // Set alarm 1
setAlarm(5063, 1453774418) // Set alarm 2

cancelAlarm(5062) // Cancel alarm 1
cancelAlarm(5063) // Cancel alarm 2

设置多个闹钟总是有效的,我可以设置任意多个,它们都会产生通知。但是,如果我要取消警报 1,它也会取消警报 2。

我知道设置和取消时pending intent必须是一样的,而且每个pending intent都有它自己唯一的请求码,所以我不知道为什么它不起作用。我花了很多时间在谷歌上搜索,但 none 的建议答案对我有所帮助。

void setAlarm(int request_code, long alarm_time) {
    Intent intent = new Intent(context, NotificationReceiver.class);
    intent.putExtra("request_code", request_code);
    PendingIntent pendingIntent = PendingIntent.getService(context, request_code, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    alarmManager.setExact(AlarmManager.RTC_WAKEUP, alarm_time, pendingIntent);
}

void cancelAlarm(int request_code) {
    Intent intent = new Intent(context, NotificationReceiver.class);
    intent.putExtra("request_code", request_code);
    PendingIntent pendingIntent = PendingIntent.getService(context, request_code, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    pendingIntent.cancel();
    alarmManager.cancel(pendingIntent);
}

答案很简单

Intent firstIntent = new Intent(this, Receiver.class);
intent.setAction("action 1");
intent.putExtra("extra", "extra1");
firstPendingIntent = PendingIntent.getBroadcast(this, 0, firstIntent, 0);

Intent secondIntent = new Intent(this, Receiver.class);
intent.setAction("action 2");
intent.putExtra("extra", "extra2");
secondPendingIntent = PendingIntent.getBroadcast(this, 0, secondIntent, 0);

如果您比较在上述代码中创建的两个 PendingIntents,它们不相等

但是在下面的代码中:

Intent firstIntent = new Intent(this, Receiver.class);
intent.setAction("action 1");
intent.putExtra("extra", "extra1");
firstPendingIntent = PendingIntent.getBroadcast(this, 0, firstIntent, 0);
Intent secondIntent = new Intent(this, Receiver.class);
intent.setAction("action 1");
intent.putExtra("extra", "extra2");
secondPendingIntent = PendingIntent.getBroadcast(this, 0, secondIntent, 0);

如果你比较两个 PendingIntents,它们将是相等的,所以你在 putExtra 方法中传递什么并不重要