Есть ли гарантия выполнения задачи в WorkManager в определенный момент
Что проверяют
Понимаете ли вы, какую гарантию на самом деле даёт WorkManager. Правильный короткий ответ: нет, гарантировано только то, что задача выполнится когда-нибудь после выполнения условий. Следом спрашивают, что тогда брать для будильника или напоминания в точное время.
Как отвечать
- что гарантировано: задача сохраняется в собственной базе WorkManager, переживает закрытие приложения и перезагрузку устройства и будет выполнена, когда выполнятся
Constraints(сеть, зарядка). Семантика «хотя бы один раз»: приResult.retry()или гибели процесса работа повторяется с backoff, по умолчанию экспоненциальным от 30 секунд; - что не гарантировано: момент запуска. Планирует на современных версиях
JobScheduler, и система откладывает работу из-за Doze, App Standby Buckets, энергосбережения и оболочек производителей.setInitialDelay()задаёт минимальную задержку, а не точное время; - периодические задачи: интервал не меньше 15 минут, меньшее значение молча поднимается до минимума. Момент внутри периода не фиксирован,
flexIntervalлишь сдвигает окно запуска к концу периода; - срочные задачи:
setExpedited()просит запустить как можно скорее, но в пределах квоты, поэтому указываютOutOfQuotaPolicy. Это «поскорее», а не «в 9:00».
Для точного времени нужен AlarmManager.setExactAndAllowWhileIdle(). С Android 12 для него требуется разрешение SCHEDULE_EXACT_ALARM, а с Android 14 большинству новых установок оно по умолчанию не выдаётся, и пользователь включает его в настройках. USE_EXACT_ALARM оставлен для будильников и календарей.
Где спотыкаются
Ставят через WorkManager напоминание на конкретный час и получают его с опозданием в полчаса или ночью, когда телефон вышел из Doze.
Задают периодическую синхронизацию раз в 5 минут и не замечают, что она идёт раз в 15. Или считают, что период соблюдается строго.
Пишут неидемпотентный Worker: повтор после сбоя отправляет платёж или письмо второй раз. Раз гарантия «хотя бы один раз», повторный запуск должен быть безопасен. Отдельно помните, что принудительная остановка приложения из настроек снимает запланированную работу до следующего запуска.