Перейти к содержанию

Фоновая работа и поведение системы

Android ограничивает выполнение в фоне, чтобы экономить батарею, защищать приватность и поддерживать стабильность системы. Процесс приложения может быть остановлен в любой момент, поэтому долгоживущую работу нужно передавать подходящему системному API.

Выбор API по типу задачи

Задача Предпочтительный API
Отложенная надёжная работа WorkManager
Немедленная длительная работа, видимая пользователю Foreground service
Пользовательское действие в точное время AlarmManager, если точность обоснована
Событие с сервера FCM, затем при необходимости планирование надёжного продолжения

Режим Doze

Doze ограничивает фоновую работу процессора и сети, когда устройство не используется. Система откладывает обычные задачи, синхронизацию, сетевой доступ и стандартные будильники, а затем периодически открывает окна обслуживания для пакетного выполнения работы.

Doze не гарантирует запуск задачи в ближайшем окне. Не рассчитывайте на непрерывную работу в фоне. Для задач, которые могут подождать, используйте WorkManager или JobScheduler, а точные будильники оставляйте для срочных пользовательских сценариев.

WorkManager

WorkManager - рекомендуемый Jetpack API для отложенной работы, которая должна выполниться после соблюдения условий: синхронизации, отправки логов, очистки и сетевых операций с повторными попытками.

Он поддерживает одноразовые и периодические задачи, условия, уникальные задачи, цепочки, повторные попытки, задержку между ними и сохранение после завершения процесса или перезагрузки устройства. Точное время запуска не гарантируется. Периодическая работа выполняется неточно и имеет минимальный интервал.

Ускоренные задачи подходят для короткой важной работы, которая должна начаться быстро, но ограничены квотами. Для длительной видимой пользователю работы нужен foreground-режим, а не скрытый непрерывный worker.

Foreground services

Foreground service предназначен для работы, о которой пользователь знает прямо сейчас: навигации, воспроизведения медиа, звонка, геолокации или взаимодействия с подключённым устройством. Такой сервис обязан показывать постоянное уведомление.

Foreground service не создаёт отдельный поток: блокирующую работу всё равно нужно выполнять вне main thread. Современный Android ограничивает запуск из фона и требует подходящий тип сервиса и разрешения. Используйте сервис только во время видимой пользователю операции.

Будильники, push-сообщения и ограничения

Используйте AlarmManager, когда пользователь ожидает действие в конкретное время, например будильник. Точные будильники сильнее расходуют батарею и могут требовать специального доступа; периодическую синхронизацию обычно следует поручать WorkManager.

FCM даёт короткое окно для обработки push-сообщения, а не неограниченное фоновое выполнение. Надёжное продолжение при необходимости следует планировать отдельно.

Ограничения также затрагивают сервисы, неявные broadcast-сообщения, геолокацию, задачи и сеть. Учитывайте задержки, завершение процесса, повторные запуски и retries; по возможности делайте фоновые операции идемпотентными.

Связанные темы