Фоновая работа и поведение системы
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; по возможности делайте фоновые операции идемпотентными.