Фоновая работа в современном Android
Вопрос
Расскажи, как в современном Android выполнять фоновую работу и какие ограничения вводила система.
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Главный поток: ANR через 5 секунд, сеть и диск запрещены
Корутины для работы, привязанной к экрану
Android 8: ограничения фоновых сервисов
Android 12 и 14: запрет запуска foreground из фона и обязательные типы
WorkManager для отложенной гарантированной работы с ограничениями
Doze и App Standby откладывают работу; точное время только AlarmManager
Что могут спросить следом
- Почему нельзя просто держать поток в фоне?
- Что такое expedited work?
- Как WorkManager работает под капотом?
Разбор
Сначала граница главного потока: всё, что дольше нескольких миллисекунд, ухожу с него, иначе рывки, а через 5 секунд без ответа на ввод ANR. Работу, связанную с экраном, делаю корутинами в viewModelScope, она отменится, когда экран закроют. Дальше система много лет урезала фон ради батареи. Android 8 запретил запускать обычные сервисы из фона, Android 12 запретил стартовать foreground-сервисы из фона, кроме исключений, а Android 14 сделал обязательными типы foreground-сервисов с отдельными разрешениями. Doze и бакеты ожидания откладывают фоновые задачи. Поэтому для работы, которую нужно гарантированно сделать, но можно отложить, например синхронизации или загрузки логов, беру WorkManager с ограничениями «есть сеть» и повторами: он переживает и закрытие приложения, и перезагрузку. Для долгой работы, о которой знает пользователь, как музыка или загрузка большого файла, foreground service с правильным типом. А если нужно точное время, только AlarmManager с разрешением на точные будильники.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.