Я поддерживаю приложение «Будильник» в качестве хобби, которое я недавно начал переносить на целевой уровень API 26. Из-за ограничения фоновой службы мое приложение больше не работает надежно.
Текущая реализация работает так:
- Пользователь устанавливает будильник в пользовательском интерфейсе
- android.app.AlarmManager#setAlarmClock вызывается с PendingIntent.getBroadcast в качестве полезной нагрузки.
- Когда срабатывает тревога, ее получает BroadcastReceiver.
- Во-первых, он захватывает 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?
Спасибо