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

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

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

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

С 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?

Спасибо


person Yuriy Kulikov    schedule 24.01.2019    source источник


Ответы (1)


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

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

person Yuriy Kulikov    schedule 07.04.2019
comment
Похоже, что Google постоянно лажает с разработчиками в новых выпусках, из-за чего становится сложнее или почти невозможно поддерживать старые или создавать новые полезные приложения... - person mvp; 08.04.2019
comment
@mvp да, и что меня больше всего беспокоит, так это то, что они фактически сломали мое приложение на Android 9. Приложение работало нормально, а затем я начал получать негативные отзывы от пользователей новых телефонов. Обратная совместимость - видимо, не то, что ценит Google. - person Yuriy Kulikov; 08.04.2019