Android AlarmManager 重调度逻辑

Posted

技术标签:

【中文标题】Android AlarmManager 重调度逻辑【英文标题】:Android AlarmManager Rescheduling Logic 【发布时间】:2012-06-13 07:14:08 【问题描述】:

我有一个应用程序,它允许用户安排闹钟在特定时间响起,并在他们选择的时间间隔内重复。我正在使用 JSON 来保存警报详细信息,使用 SharedPreferences 作为存储。

我正在使用 AlarmManager 来安排何时应通知我的应用程序应发出警报以通知用户。我目前正在使用 AlarmManager 的 setRepeating() 方法,提供用户提供的间隔。这很好用,理论上应用程序永远不需要更新存储下一个闹钟时间的 JSon,因为 AlarmManager 只会使用间隔重新安排下一个闹钟时间。

但是,我的想法是,当设备重新启动时,我需要向 AlarmManager 提供最新的警报时间,以避免 AlarmManager 认为警报已经错过,因为这不一定是案例。

那么,最好的方法是什么?

当闹钟响起时更新 JSon 下一个闹钟时间,即使这可能不是必需的(只要没有重新启动,setRepeating() 就会处理这个问题)? 然后注册并收听关机广播并更新 JSon(这引发了一些问题 - 考虑到手机正在关机,应用程序将在多长时间内计算警报详细信息并将其写入存储)? 不要更新 JSon,而是将逻辑添加到由 AlarmManager唤醒 的对象,以决定刚刚广播的警报是否有效,是否应该提醒用户?

我确信上述任何方法都可以,但我无法确定哪种方法最好。

【问题讨论】:

【参考方案1】:

这似乎主要是一个选择问题。您注意到的问题与在 Linux 笔记本电脑中看到并由 anachrond 解决的一般问题相似。在我看来,每次收到事件时,我都会简单地更新时间并将其存储在 SharedPreferences 中。尝试监听系统何时关闭可能并不完全可靠(当您的用户(可能是醉酒的大学生)掉落设备并且电池耗尽时会发生什么?)。相反,我认为在这种情况下最好的做法是——每次警报触发时——重新计算发送下一个警报的时间,将其存储在某个地方,并根据启动计划适当地进行。

【讨论】:

是的,假设生命周期事件总是按计划进行是应用程序中的一个常见问题,实际上真实设备随时可能死机,生产应用程序必须做好相应准备:-)

以上是关于Android AlarmManager 重调度逻辑的主要内容,如果未能解决你的问题,请参考以下文章

android app被杀死 alarmmanager能不能唤醒

Android - AppWidgets、AlarmManager 和 AsyncTask

Android取消所有alarmmanager

Android定时器AlarmManager

Android 8.0 AlarmManager 后台定时任务

Android闹钟 AlarmManager的使用