如何为 Android 26+ 实施强大的闹钟应用程序

How to implement robust alarm clock applications for Android 26+

我将闹钟应用程序作为一种爱好,最近开始迁移到目标 API 级别 26。由于后台服务限制,我的应用程序不再可靠地运行。

当前的实现是这样的:

  1. 用户在 UI
  2. 中设置了闹钟
  3. android.app.AlarmManager#setAlarmClock 以 PendingIntent.getBroadcast 作为有效载荷被调用
  4. 当警报响起时,BroadcastReceiver 获取它
  5. 首先,它获取一个唤醒锁
  6. 然后它启动一个服务
  7. 服务处理事件并产生更多事件,例如为音乐、启动活动或通知启动其他服务
  8. 释放唤醒锁

使用 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!