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

时间:2019-01-24 09:10:37

标签: android android-service alarmmanager android-alarms android-8.1-oreo

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

当前的实现方式如下:

  1. 用户在用户界面中设置警报
  2. 使用PendingIntent.getBroadcast作为有效负载调用android.app.AlarmManager#setAlarmClock
  3. 警报响起时,BroadcastReceiver收到警报
  4. 首先,它会抓住一个唤醒锁
  5. 然后启动服务
  6. 服务处理事件并产生更多事件,例如,为音乐,开始活动或通知规定其他服务
  7. 唤醒锁已释放

使用Target SDK 25,一切都很好。使用taraget 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设置的警报时,我必须可靠地执行代码的哪些选项?

谢谢

1 个答案:

答案 0 :(得分:1)

在尝试了多种方法之后,我得出了这样的结论:执行代码的唯一可靠方法是在BroadcastReceiver内执行或启动前台服务。事实证明,其他一切也不可靠。

所以,回到胖胖的BroadcastReceivers!