Какие сервисы использовать на Android 8 и выше для фоновых задач
Что проверяют
Знаете ли вы, что после Android 8 фоновый Service перестал быть универсальным решением, и умеете ли подобрать инструмент под тип задачи. Следом обычно спрашивают про ограничения foreground-сервисов в Android 12 и 14.
Как отвечать
Начните с того, что изменилось в Android 8 (API 26): вскоре после ухода приложения в фон система останавливает его фоновые сервисы, а startService() из фона бросает IllegalStateException. Дальше выбор по типу задачи:
- WorkManager: основной вариант для отложенной работы, которая должна выполниться гарантированно, например синхронизация или загрузка файлов. Переживает перезапуск приложения и устройства, поддерживает
Constraints(сеть, зарядка), цепочки и повторы с backoff. Под капотом используетJobScheduler. Периодическая задача запускается не чаще раза в 15 минут; - срочная работа:
setExpedited()в WorkManager для коротких задач, результат которых пользователь ждёт сейчас; - foreground-сервис: долгая работа, заметная пользователю: плеер, навигация, звонок. Запуск через
ContextCompat.startForegroundService(), после чего за несколько секунд нужно вызватьstartForeground()с уведомлением. С Android 12 запускать его из фона почти нельзя, с Android 14 обязателенforegroundServiceTypeв манифесте и разрешение под этот тип; - корутины во
viewModelScope: работа, которая нужна, только пока открыт экран; AlarmManager: действие к точному времени, например будильник. Точные будильники с Android 12 требуют отдельного разрешения;JobSchedulerнапрямую: редко, WorkManager закрывает те же сценарии удобнее.
IntentService и JobIntentService устарели.
Где спотыкаются
Предлагают обычный Service с бесконечным циклом. Его остановит система, а на ряде прошивок ещё и агрессивная экономия батареи.
Считают, что WorkManager выполнит задачу точно в срок. Он гарантирует выполнение, но не время: Doze и App Standby откладывают работу, а для точного времени нужен AlarmManager.
Делают foreground-сервис для любой фоновой синхронизации. Это лишнее уведомление в шторке, а в Google Play тип foreground-сервиса приходится обосновывать.