您不需要保存 PendingIntent 实例本身。AlarmManager.cancel(PendingIntent operation) 的文档说,
删除任何具有匹配 Intent 的警报。任何类型的任何警报,其 Intent 与此匹配(由 filterEquals(Intent) 定义)都将被取消。
如果您查看 Intent.filterEquals(Intent),它会说,
出于意图解析(过滤)的目的,确定两个意图是否相同。也就是说,如果它们的动作、数据、类型、类和类别相同。这不会比较意图中包含的任何额外数据。
因此,您可以使用相同的操作创建一个 PendingIntent 并使用该新的待处理意图执行 am.cancel() ,它也会取消先前的待处理意图。
这是一个快速的代码示例:
private static final String ALARM_ACTION = "foo.bar.MY_ALARM_ACTION";
private PendingIntent getAlarmIntent() {
Intent alarmIntent = new Intent(ALARM_ACTION);
PendingIntent pi = PendingIntent.getBroadcast(this, 0, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT); // or whatever flag you need
return pi;
}
现在您可以使用从上述函数返回的 PendingIntent 调用 am.set(),也可以使用从同一函数返回的 PendingIntent 调用 am.cancel()。PendingIntent 是否是同一个实例并不重要,它只需要匹配 Intent.filterEquals() 测试(所以基本上只有 Intent 操作必须匹配)。
因此,基本上只需使用相同的操作来创建设置/取消警报的意图,它就会起作用。