Как реализовать надежные приложения-будильники для Android 26+

Я поддерживаю приложение "Будильник" в качестве хобби, которое я недавно начал мигрировать на целевой уровень API 26. Из-за ограничений фонового сервиса мое приложение больше не работает надежно.

Текущая реализация работает так:

  1. Пользователь устанавливает будильник в пользовательском интерфейсе
  2. android.app.AlarmManager#setAlarmClock вызывается с PendingIntent.getBroadcast в качестве полезной нагрузки.
  3. Когда срабатывает сигнал тревоги, BroadcastReceiver получает его
  4. Во-первых, он захватывает Wakelock
  5. Затем он запускает Сервис
  6. Сервис обрабатывает событие и генерирует больше событий, например, регистрирует другие сервисы для музыки, запускает деятельность или уведомляет
  7. Wakelock выпущен

С Target SDK 25 все было хорошо. С помощью API-интерфейса taraget 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?

Спасибо

0 ответов

После того, как я попробовал немало подходов, я пришел к такому выводу: единственный надежный способ выполнить код - это выполнить его в BroadcastReceiver или запустить службу переднего плана. Все также оказалось ненадежным.

Итак, вернемся к большим толстым BroadcastReceivers!

Другие вопросы по тегам