Ответ вслух Middle Многопоточность и WorkManager спрашивают часто обновлено

Фоновая работа в современном Android

Вопрос

Расскажи, как в современном Android выполнять фоновую работу и какие ограничения вводила система.

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Сначала граница главного потока: всё, что дольше нескольких миллисекунд, ухожу с него, иначе рывки, а через 5 секунд без ответа на ввод ANR. Работу, связанную с экраном, делаю корутинами в viewModelScope, она отменится, когда экран закроют.

Что должно прозвучать в ответе

  • Главный поток: 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 ошибок.