Какие варианты запуска задач по расписанию существуют в Android, если AlarmManager недостаточно точен
Что проверяют
Знаете ли вы, как Android ограничивает фоновую работу, и понимаете ли, что точность это компромисс с батареей. Хороший ответ начинается с уточнения: насколько точно нужно и должна ли задача сработать при закрытом приложении. Следом почти всегда спрашивают про Doze и разрешение на точные будильники.
Как отвечать
Сначала поправьте постановку: у AlarmManager есть точные методы, а неточен обычно set(), который с API 19 система вправе сдвигать и группировать. Варианты:
WorkManager: гарантирует выполнение с учётом условий (сеть, зарядка) и переживает перезапуск, но время не гарантирует. Минимальный интервал периодической задачи 15 минут;JobScheduler: системный механизм, на котором работаетWorkManager. Точность такая же, «когда системе удобно»;setExactAndAllowWhileIdle(): срабатывает точно и в Doze, но в режиме простоя не чаще раза в несколько минут на приложение;setAlarmClock(): самый точный вариант, система выходит из Doze заранее, а пользователь видит значок будильника;Foreground ServiceсHandlerили корутиной внутри: точность высокая, пока жив процесс, но нужно постоянное уведомление и объявленныйforegroundServiceType;- серверный пуш: FCM с высоким приоритетом будит приложение, если время знает бэкенд.
Про разрешения: с Android 12 точные будильники требуют SCHEDULE_EXACT_ALARM, а с Android 14 новым установкам оно по умолчанию не выдаётся. Проверяйте canScheduleExactAlarms() и ведите пользователя в настройки.
Где спотыкаются
Предлагают WorkManager как «более точную замену» AlarmManager. Всё наоборот: он надёжнее, но точность у него ниже.
Считают, что ScheduledExecutorService или Timer решают задачу. Они живут внутри процесса, и когда система его убьёт, расписание исчезнет вместе с ним.
Забывают про перезагрузку: будильники AlarmManager после рестарта устройства сбрасываются, их ставят заново в BroadcastReceiver на BOOT_COMPLETED. И не учитывают, что оболочки некоторых производителей убивают фон агрессивнее стокового Android.