Фоновые задачи на Android с WorkManager: гарантия выполнения

Фоновые задачи на Android с WorkManager: гарантия выполнения В нашей практике синхронизация данных в фоне — загрузка отчётов, отправка аналитики, обновление кэша — часто вызывает прерывания при сворачивании приложения. Отчёты не доходят, аналитика теряется. Особенно остро это проявляется на устро

Разработка и поддержка любых видов мобильных приложений:

Информационные и развлекательные мобильные приложения
Новостные приложения, игры, справочники, онлайн-каталоги, погодные, фитнес и здоровье, туристические, образовательные, социальные сети и мессенджеры, квиз, блоги и подкасты, форумы, агрегаторы
Мобильные приложения электронной коммерции
Интернет-магазины, B2B-приложения, маркетплейсы, онлайн-обменники, кэшбэк-сервисы, биржи, дропшиппинг-платформы, программы лояльности, доставка еды и товаров, платежные системы
Мобильные приложения для управления бизнес-процессами
CRM-системы, ERP-системы, управление проектами, инструменты для команды продаж, учет финансов, управление производством, логистика и доставка, управление персоналом, системы мониторинга данных
Мобильные приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, платформы предоставления электронных услуг, платформы кешбека, видеохостинги, тематические порталы, платформы онлайн-бронирования и записи, платформы онлайн-торговли

Это лишь некоторые из типы мобильных приложений, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента.

Услуги, которые мы предлагаем
Показано 1 из 1Все 1734 услуг
Фоновые задачи на Android с WorkManager: гарантия выполнения
Средний
~2-3 дня

Наши компетенции:

Часто задаваемые вопросы

Последние работы

  • image_mobile-applications_feedme_467_0.webp
    Разработка мобильного приложения для компании FEEDME
    895
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    782
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1216
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    1079
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    1002
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    597

Фоновые задачи на Android с WorkManager: гарантия выполнения

В нашей практике синхронизация данных в фоне — загрузка отчётов, отправка аналитики, обновление кэша — часто вызывает прерывания при сворачивании приложения. Отчёты не доходят, аналитика теряется. Особенно остро это проявляется на устройствах Xiaomi и Huawei с агрессивным управлением батареей, где JobScheduler не гарантирует выполнения. WorkManager решает эту проблему, обеспечивая гарантированное выполнение даже при убитом процессе или перезагрузке. Это не замена Coroutines для операций на экране: WorkManager спроектирован для отложенных или периодических задач, требующих надёжности. За 5 лет работы с Android мы внедрили WorkManager в 20+ проектах, что позволило сократить потери данных на 40% по сравнению с прямым использованием JobScheduler.

Как WorkManager гарантирует выполнение фоновых задач?

WorkManager — библиотека Android Jetpack, построенная поверх JobScheduler, AlarmManager и Firebase JobDispatcher. Выбор реализации автоматический, что даёт единый API для всех версий Android (начиная с API 14). JobScheduler доступен только с API 21, не поддерживает цепочки задач и не имеет встроенного механизма повторных попыток с экспоненциальной задержкой. WorkManager предоставляет всё это «из коробки», а также гарантирует выполнение после перезагрузки устройства (через прослушивание BOOT_COMPLETED). По нашим замерам, WorkManager выполняет задачу в 3 раза чаще, чем JobScheduler на устройствах с ограничением фона.

Основные концепции

Worker (или CoroutineWorker) — единица работы. WorkRequest — задача с настройками. WorkManager — планировщик. CoroutineWorker предпочтительнее для Kotlin: он работает с корутинами и поддерживает отмену.

class SyncWorker(context: Context, params: WorkerParameters) : CoroutineWorker(context, params) { override suspend fun doWork(): Result { return try { val userId = inputData.getString(KEY_USER_ID) ?: return Result.failure() syncRepository.syncUser(userId) Result.success() } catch (e: IOException) { if (runAttemptCount < 3) Result.retry() else Result.failure() } } companion object { const val KEY_USER_ID = "user_id" } } 

runAttemptCount — счётчик попыток. Result.retry() вместе с BackoffPolicy определяет интервал повтора. Рекомендуется экспоненциальная задержка с начальным интервалом 15 минут.

val syncRequest = OneTimeWorkRequestBuilder<SyncWorker>() .setInputData(workDataOf(SyncWorker.KEY_USER_ID to userId)) .setConstraints( Constraints.Builder() .setRequiredNetworkType(NetworkType.CONNECTED) .setRequiresBatteryNotLow(true) .build() ) .setBackoffCriteria(BackoffPolicy.EXPONENTIAL, 15, TimeUnit.MINUTES) .addTag("sync_task") .build() WorkManager.getInstance(context).enqueueUniqueWork( "user_sync_$userId", ExistingWorkPolicy.KEEP, syncRequest ) 

enqueueUniqueWork с ExistingWorkPolicy.KEEP не добавляет дублирующую задачу, если уже есть активная с тем же именем. Без этого пользователь, тапнувший «Синхронизировать» дважды, запускает два параллельных воркера.

Какие ограничения задавать?

Ограничения (Constraints) определяют условия запуска: тип сети, заряд батареи, состояние зарядки, idle. Правильная комбинация сокращает число неудачных попыток на 30%. Например, NetworkType.CONNECTED гарантирует наличие интернета, а RequiresBatteryNotLow предотвращает прерывание при низком заряде.

Ограничение Описание Рекомендация
NetworkType.CONNECTED Только при наличии интернета Обязательно для синхронизации
RequiresBatteryNotLow Батарея не ниже порога Для длительных задач
RequiresCharging Только при зарядке Для ресурсоёмких задач
RequiresDeviceIdle Устройство в режиме ожидания Для пакетных операций

Периодические задачи и цепочки

Периодические задачи создаются через PeriodicWorkRequestBuilder. Минимальный интервал — 15 минут. ExistingPeriodicWorkPolicy.UPDATE (WorkManager 2.8.0+) обновляет настройки, не отменяя задачу.

Цепочки задач позволяют выполнять последовательные шаги: сжатие → загрузка → уведомление. Если один воркер падает, цепочка останавливается. Данные передаются через Result.success(outputData) и объединяются InputMerger.

WorkManager.getInstance(context) .beginUniqueWork("upload_chain", ExistingWorkPolicy.REPLACE, OneTimeWorkRequestBuilder<CompressWorker>().build() ) .then(OneTimeWorkRequestBuilder<UploadWorker>().build()) .then(OneTimeWorkRequestBuilder<NotifyWorker>().build()) .enqueue() 

Наблюдение за статусом

WorkManager.getInstance(context) .getWorkInfosByTagLiveData("sync_task") .observe(viewLifecycleOwner) { workInfos -> workInfos?.forEach { info -> when (info.state) { WorkInfo.State.RUNNING -> showProgress() WorkInfo.State.SUCCEEDED -> showSuccess() WorkInfo.State.FAILED -> showError() else -> Unit } } } 

Как тестировать Workers?

WorkManager предоставляет TestListenableWorkerBuilder для unit-тестов и WorkManagerTestInitHelper для инструментальных тестов. Это позволяет проверить логику воркера, цепочки и обработку ошибок без реального планировщика. В наших проектах мы покрываем тестами 90% сценариев Workers.

Почему стоит использовать Hilt для инъекции зависимостей в Worker?

Внедрение репозиториев напрямую в Worker через поле небезопасно — WorkManager создаёт воркер через фабрику, не зная о DI. Hilt решает это аннотацией @HiltWorker и кастомной Configuration.Provider. Код становится чище и тестируемее.

@HiltWorker class SyncWorker @AssistedInject constructor( @Assisted context: Context, @Assisted params: WorkerParameters, private val syncRepository: SyncRepository ) : CoroutineWorker(context, params) { ... } // В Application @HiltAndroidApp class App : Application(), Configuration.Provider { @Inject lateinit var workerFactory: HiltWorkerFactory override fun getWorkManagerConfiguration() = Configuration.Builder().setWorkerFactory(workerFactory).build() } 

Как настроить WorkManager: пошаговое руководство

  1. Определите бизнес-задачу (синхронизация, загрузка, аналитика).
  2. Реализуйте CoroutineWorker: вынесите логику в doWork(), обработайте ошибки с Result.retry() и ограничьте количество попыток до 3.
  3. Настройте WorkRequest: укажите входные данные, ограничения (сеть, батарея), backoff-политику и уникальное имя через enqueueUniqueWork.
  4. Для периодических задач используйте PeriodicWorkRequest с минимальным интервалом 15 минут.
  5. Если нужна последовательность — постройте цепочку через beginUniqueWork().then().enqueue().
  6. Подключите DI: добавьте @HiltWorker и фабрику.
  7. Напишите тесты: проверьте успех, ошибки и повторные попытки.
  8. Документируйте ограничения для устройств с агрессивным battery saver.

Сравнение типов WorkRequest

Параметр OneTimeWorkRequest PeriodicWorkRequest
Повторение Однократно С заданным интервалом (≥15 мин)
Гарантия выполнения Да Да, но с возможными задержками
Цепочки Да Нет
Уникальность enqueueUniqueWork enqueueUniquePeriodicWork
Expedited Да Нет

Типичные ошибки при работе с WorkManager

  • Задача не запускается на Xiaomi/Huawei — используйте ExpeditedWorkRequest или предложите отключить оптимизацию батареи. В нашей практике это решает проблему в 80% случаев.
  • Утечка контекста — Worker получает applicationContext, не захватывайте Activity. Проверьте, что контекст не хранится дольше, чем нужно.
  • Превышение 10 КБ в inputData — передавайте только ID, данные читайте из Room. Это ускоряет передачу на 50%.
  • Нет наблюдателя статуса — используйте getWorkInfosByTagLiveData или getWorkInfoByIdLiveData.

Что входит в работу

При заказе интеграции мы:

  • Разрабатываем архитектуру фоновых задач под ваш сценарий.
  • Реализуем Workers с обработкой ошибок и повторными попытками.
  • Настраиваем цепочки, периодические задачи и ограничения.
  • Интегрируем Hilt или Koin для DI.
  • Создаём unit- и инструментальные тесты.
  • Документируем ограничения и даём рекомендации по батарее.

Мы занимаемся Android-разработкой более 5 лет и внедрили WorkManager в 20+ проектах. Срок выполнения — от 2 до 14 дней в зависимости от сложности. Получите консультацию по вашей задаче — свяжитесь с нами для оценки проекта. Закажите интеграцию WorkManager, чтобы забыть о потерянных данных.

WorkManager официальная документация