Flutter Awesome Notifications调用cancelAllSchedules无法取消定时通知
awesome_notifications 定时通知无法取消排查解决方案
调用cancelAllSchedules()返回成功但通知仍触发,按以下顺序排查修复:
- 先验证插件侧调度记录清空状态:执行取消方法后立刻调用
await AwesomeNotifications().listScheduledNotifications()打印返回结果,如果列表不为空,属于插件版本bug:0.7.x及更早版本在安卓13、iOS16系统上存在cancelAllSchedules()仅清空本地缓存、未调用系统通知服务接口的问题,直接升级到最新稳定版即可修复。 - 如果上述接口返回空列表但通知仍按时触发,属于系统层面残留调度任务,分平台处理:
- 安卓端
- 安卓12及以上设备先检查精确闹钟权限,未授权时插件创建的定时通知会走系统模糊调度通道,插件自身无权限清除这部分排期任务,先引导用户开启
SCHEDULE_EXACT_ALARM权限后再执行取消,也可在原生层调用AlarmManager接口清除当前应用名下所有闹钟任务做兜底。 - 检查通知创建配置:如果创建时设置了
persistent: true常驻通知属性、或者使用了自定义重复规则的调度任务,部分国产ROM会将这类任务加入系统自启动保活队列,不会响应插件的批量取消指令。这种场景不要仅依赖cancelAllSchedules(),遍历业务侧存储的所有通知ID,逐个调用cancel(notificationId)执行取消。 - 避免在应用后台被系统冻结状态下调用取消方法,此时await返回的成功仅代表插件本地数据库操作完成,取消指令未同步到系统通知服务,将应用切到前台后重新执行取消操作即可。
- 安卓12及以上设备先检查精确闹钟权限,未授权时插件创建的定时通知会走系统模糊调度通道,插件自身无权限清除这部分排期任务,先引导用户开启
- iOS端
- 检查通知监听回调(
displayedStream、actionStream等)中是否存在重新创建定时通知的逻辑,这类逻辑会导致取消后立刻重新生成调度任务,表现为取消失效。 - 旧版本插件中通过
zonedSchedule创建的跨时区定时通知会重复注册多个不同时区的调度任务,cancelAllSchedules()仅能清除当前时区对应任务,升级插件版本或逐个ID取消即可解决。
- 检查通知监听回调(
- 安卓端
- 通用兜底方案:业务侧自行维护所有已创建定时通知的ID列表,取消操作时先调用
cancelAllSchedules(),再遍历ID列表逐个调用cancel();每次应用冷启动时额外执行一次上述取消逻辑,清理系统残留的调度任务。
内容的提问来源于stack exchange,提问作者yusuf nadaroğlu
相关产品推荐
相关产品推荐

