Какие альтернативы сервисам существуют в Android?
Что проверяют
Знаете ли вы, что с Android 8 фоновые сервисы жёстко ограничены и что для большинства задач Service сегодня не лучший выбор. Следом обычно дают сценарий: загрузка файла, синхронизация раз в час, будильник, и просят выбрать инструмент.
Как отвечать
Выбор строится от вопроса, когда и насколько гарантированно задача должна выполниться:
- корутины во
viewModelScopeилиlifecycleScope: работа, которая нужна, пока открыт экран. Ушёл пользователь, работа отменилась, и это правильно; - WorkManager: отложенная работа с гарантией выполнения даже после перезагрузки устройства. Есть условия запуска (
setRequiredNetworkType, зарядка), цепочки,CoroutineWorker, периодические задачи с минимальным интервалом 15 минут и срочные черезsetExpedited; - JobScheduler: системный API с API 21, WorkManager использует его под капотом, напрямую сейчас пишут редко;
- AlarmManager: запуск в точное время, будильник или напоминание. Для точных будильников с Android 12 нужно разрешение
SCHEDULE_EXACT_ALARM; - пуш с высоким приоритетом через FCM: когда событие приходит с сервера, это заменяет постоянное соединение из сервиса;
- foreground service: остаётся для того, что пользователь видит и ждёт, например навигация или музыка. С Android 14 обязательно указывать
foregroundServiceTypeи соответствующее разрешение; - user-initiated data transfer job: с Android 14 длинная загрузка, начатая пользователем, оформляется через JobScheduler, а не через сервис.
Где спотыкаются
Называют BroadcastReceiver альтернативой сервису. onReceive выполняется в главном потоке и должен быстро завершиться, иначе ANR, поэтому из ресивера работу передают в WorkManager.
Ставят WorkManager на задачи с точным временем. Он учитывает условия и режим Doze, поэтому задача выполнится позже, а период короче 15 минут не задать.
Запускают вечный foreground service для синхронизации. На новых версиях без типа сервиса приложение падает, а старт такого сервиса из фона разрешён только в перечисленных системой исключениях.