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

问题描述 投票:4回答:1

我维护一个闹钟应用程序作为业余爱好,我最近开始迁移到目标API级别26.由于后台服务限制,我的应用程序不再可靠地工作。

当前实现的工作方式如下:

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

使用Target SDK 25一切都很好。目标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设置的警报被触发时,我有什么选项可靠地执行代码?

谢谢

android android-service alarmmanager android-alarms android-8.1-oreo
1个回答
1
投票

在我尝试了很多方法后,我得出了这样的结论:执行代码的唯一可靠方法是在BroadcastReceiver中执行它或启动前台服务。一切都被证明是不可靠的。

所以,回到大胖子BroadcastReceivers!

© www.soinside.com 2019 - 2024. All rights reserved.