Как реализовать надежные приложения-будильники для Android 26+ - PullRequest
0 голосов
/ 24 января 2019

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

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

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

С 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 голосов
/ 08 апреля 2019

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

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

...