如何为 Android 26+ 实施强大的闹钟应用程序
How to implement robust alarm clock applications for Android 26+
我将闹钟应用程序作为一种爱好,最近开始迁移到目标 API 级别 26。由于后台服务限制,我的应用程序不再可靠地运行。
当前的实现是这样的:
- 用户在 UI
中设置了闹钟
- android.app.AlarmManager#setAlarmClock 以 PendingIntent.getBroadcast 作为有效载荷被调用
- 当警报响起时,BroadcastReceiver 获取它
- 首先,它获取一个唤醒锁
- 然后它启动一个服务
- 服务处理事件并产生更多事件,例如为音乐、启动活动或通知启动其他服务
- 释放唤醒锁
使用 Target SDK 25 一切都很好。使用 target API 26 应用程序可靠地从 Doze 唤醒,但点 .5 有时会失败,因为应用程序在后台:
AlarmsService$Receiver: java.lang.IllegalStateException: Not allowed to start service Intent { act=com.better.alarm.ACTION_FIRED flg=0x14 cmp=com.better.alarm/.model.AlarmsService (has extras) }: app is in background
第 .6 点中的服务可以是前台服务,我对此没意见,但第 .5 点中的服务不仅处理警报触发事件,还处理时区更改、从通知中分派的多个用户交互意图等.不能是前台服务
Android 文档建议在这种情况下使用 JobScheduler,但 JobScheduler 不保证作业会及时执行。这种做法违背了闹钟的目的。
当使用 android.app.AlarmManager#setAlarmClock 设置的警报被触发时,我有哪些选项可以可靠地执行代码?
谢谢
在我尝试了很多方法之后,我得出了这个结论:执行代码的唯一可靠方法是在 BroadcastReceiver 中执行 或启动前台服务。其他一切都被证明是不可靠的。
所以,回到大胖 BroadcastReceivers!
我将闹钟应用程序作为一种爱好,最近开始迁移到目标 API 级别 26。由于后台服务限制,我的应用程序不再可靠地运行。
当前的实现是这样的:
- 用户在 UI 中设置了闹钟
- android.app.AlarmManager#setAlarmClock 以 PendingIntent.getBroadcast 作为有效载荷被调用
- 当警报响起时,BroadcastReceiver 获取它
- 首先,它获取一个唤醒锁
- 然后它启动一个服务
- 服务处理事件并产生更多事件,例如为音乐、启动活动或通知启动其他服务
- 释放唤醒锁
使用 Target SDK 25 一切都很好。使用 target API 26 应用程序可靠地从 Doze 唤醒,但点 .5 有时会失败,因为应用程序在后台:
AlarmsService$Receiver: java.lang.IllegalStateException: Not allowed to start service Intent { act=com.better.alarm.ACTION_FIRED flg=0x14 cmp=com.better.alarm/.model.AlarmsService (has extras) }: app is in background
第 .6 点中的服务可以是前台服务,我对此没意见,但第 .5 点中的服务不仅处理警报触发事件,还处理时区更改、从通知中分派的多个用户交互意图等.不能是前台服务
Android 文档建议在这种情况下使用 JobScheduler,但 JobScheduler 不保证作业会及时执行。这种做法违背了闹钟的目的。
当使用 android.app.AlarmManager#setAlarmClock 设置的警报被触发时,我有哪些选项可以可靠地执行代码?
谢谢
在我尝试了很多方法之后,我得出了这个结论:执行代码的唯一可靠方法是在 BroadcastReceiver 中执行 或启动前台服务。其他一切都被证明是不可靠的。
所以,回到大胖 BroadcastReceivers!