我想这可能是这个问题的答案。正如它在cancelAllNotifications()
方法的描述中所说(LocalNotification.java 第 124 行):
Android 只能取消注册特定警报。没有cancelAll这样的东西。因此,我们依靠保存所有警报的 Shared Preferences 来遍历这些警报并一一取消注册。
但是,请看一下cancelAllNotifications()
调用该方法的代码(第 59 行):
} else if (action.equalsIgnoreCase("cancelall")) {
unpersistAlarmAll();
return this.cancelAllNotifications();
}
如下unpersistAlarmAll()
所示(第 181 行):
private boolean unpersistAlarmAll() {
final Editor alarmSettingsEditor = this.cordova.getActivity().getSharedPreferences(PLUGIN_NAME, Context.MODE_PRIVATE).edit();
alarmSettingsEditor.clear();
return alarmSettingsEditor.commit();
}
发生的事情是在调用之前 从 sharedPreferences 中清除了alarmIds cancelAllNotifications()
,实际上没有留下要取消的警报。
我不确定将呼叫转移到的最佳位置在哪里unpersistAlarmAll()
,我很乐意获得一些建议。cancelAllNotifications()
同时,在测试返回的结果之后alarm.cancelAll(alarmSettings)
(第 133 行),我已将其移至 within ,如下所示:
if (result) {
unpersistAlarmAll();
return new PluginResult(PluginResult.Status.OK);
到目前为止,这似乎工作正常。也许另一种方法是废弃整个unpersistAlarmAll()
方法,而是unpersistAlarm(String alarmId)
在每个单独的警报成功取消后调用(第 168 行)。