Flutter倒计时Timer锁屏时运行异常,应用后台销毁后该如何处理?
后台应用销毁场景下的计时方案
你可以通过持久化存储关键时间戳的方式解决应用被销毁的问题,具体实现逻辑和各平台原生实现要点如下:
核心逻辑
- 不要依赖Timer的累计计数来计算剩余时间,全程以时间戳做计算基准:
- 倒计时启动时,直接计算并持久化存储「倒计时结束的时间戳」(比如当前时间戳 + 倒计时总时长,取13位毫秒级时间戳避免精度问题)
- 无论应用是退后台、锁屏、还是被用户手动销毁,只要倒计时未结束,这个时间戳都会存在本地
- 下次应用启动时,直接读取本地存储的结束时间戳,和当前系统时间戳做对比:
- 如果当前时间 < 结束时间:直接计算差值得到剩余时长,重新启动Timer继续倒计时即可
- 如果当前时间 >= 结束时间:直接触发倒计时结束的回调逻辑即可
各平台原生实现注意事项
Android 端
- 持久化存储优先使用
SharedPreferences存储时间戳,简单场景足够使用,不需要数据库 - 如果需要倒计时结束时即使应用未启动也能给用户发通知,可配合
AlarmManager或者最新的WorkManager注册定时任务,触发通知或对应业务逻辑 - 注意不要依赖系统开机时间做计算,避免用户重启设备导致时间偏差
iOS 端
- 持久化存储优先使用
UserDefaults存储时间戳 - 需要后台/销毁后也能触发通知的话,可注册
UNNotificationRequest的时间触发类型通知,系统会在指定时间自动弹出通知 - 注意如果用户修改了系统时间,会导致计算偏差,如果你对时间准确性要求极高,可以在启动时请求一次网络时间校准,和本地时间做对比修正偏差
原有Timer问题的补充优化
你之前遇到的锁屏后Timer异常的问题,用这套时间戳方案也可以顺便解决:每次应用从后台切回前台时,都重新读一次本地存储的结束时间戳,和当前时间对比后修正Timer的剩余时间即可,不需要额外保存暂停时的时间点,逻辑更简洁。
内容的提问来源于stack exchange,提问作者idiot_learner
相关产品推荐
相关产品推荐

