0Pricing
Android Academy · Урок

WorkManager и фоновые задачи

Планируйте гарантированное выполнение фоновых задач с помощью WorkManager. Используйте OneTimeWorkRequest, PeriodicWorkRequest, ограничения, передачу данных и цепочки задач.

«WorkManager и фоновые задачи» — бесплатный урок Android Academy на CoddyKit. Это урок 5 из 6. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Android Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Android Academy содержит 6 уроков всего.

Фоновая работа в Android

Android активно ограничивает фоновые задачи, чтобы экономить заряд батареи. До появления WorkManager разработчики использовали:

  • AsyncTask (устарел)
  • AlarmManager (ненадёжен после перезагрузки и в режиме Doze)
  • JobScheduler (сложный API)
  • службы (могут быть завершены, повторная попытка не предусмотрена)

WorkManager — рекомендуемое решение для отложенных фоновых задач, выполнение которых должно быть гарантировано.

Что такое WorkManager

WorkManager гарантирует выполнение задачи, даже если приложение завершено или устройство перезагрузилось. Он:

  • сохраняет задачи после перезагрузки;
  • автоматически повторяет попытку после ошибки;
  • поддерживает ограничения (только WiFi, только при зарядке и т. д.);
  • работает начиная с API 14;
  • интегрируется с корутинами Kotlin через CoroutineWorker.

Настройка

Добавьте WorkManager в app/build.gradle:

dependencies {
    implementation 'androidx.work:work-runtime-ktx:2.9.0'
}

Создание Worker

Унаследуйте класс от CoroutineWorker и реализуйте doWork(). Верните Result.success(), Result.failure() или Result.retry():

class SyncWorker(context: Context, params: WorkerParameters) : CoroutineWorker(context, params) {

    override suspend fun doWork(): Result {
        return try {
            // This runs on a background coroutine
            val repo = UserRepository(applicationContext)
            repo.syncFromNetwork()
            Result.success()
        } catch (e: Exception) {
            if (runAttemptCount < 3) Result.retry()
            else Result.failure()
        }
    }
}

OneTimeWorkRequest

Запланируйте одноразовую задачу и поставьте её в очередь:

val syncWork = OneTimeWorkRequestBuilder<SyncWorker>()
    .setInitialDelay(10, TimeUnit.MINUTES)  // optional delay
    .build()

WorkManager.getInstance(context).enqueue(syncWork)

// With a unique name (prevents duplicates):
WorkManager.getInstance(context).enqueueUniqueWork(
    "sync_work",
    ExistingWorkPolicy.KEEP,   // don't enqueue if already pending
    syncWork
)

PeriodicWorkRequest

Запланируйте повторяющиеся задачи. Минимальный интервал — 15 минут:

val periodicSync = PeriodicWorkRequestBuilder<SyncWorker>(
    repeatInterval = 1, TimeUnit.HOURS
).build()

WorkManager.getInstance(context).enqueueUniquePeriodicWork(
    "hourly_sync",
    ExistingPeriodicWorkPolicy.KEEP,
    periodicSync
)

Ограничения

Запускайте задачу только при выполнении условий: заряд батареи не низкий, WiFi подключён и т. д.:

val constraints = Constraints.Builder()
    .setRequiredNetworkType(NetworkType.UNMETERED)  // WiFi only
    .setRequiresBatteryNotLow(true)
    .setRequiresCharging(false)
    .build()

val work = OneTimeWorkRequestBuilder<SyncWorker>()
    .setConstraints(constraints)
    .build()

WorkManager.getInstance(context).enqueue(work)

Входные и выходные данные

Передавайте данные в Worker и получайте их из него с помощью объектов Data:

// Enqueue with input data:
val inputData = workDataOf("user_id" to 42)
val work = OneTimeWorkRequestBuilder<SyncWorker>()
    .setInputData(inputData)
    .build()

// Inside the Worker:
class SyncWorker(...) : CoroutineWorker(...) {
    override suspend fun doWork(): Result {
        val userId = inputData.getInt("user_id", -1)

        // Pass output data back:
        val output = workDataOf("synced_count" to 10)
        return Result.success(output)
    }
}

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

Наблюдайте за ходом выполнения задачи с помощью getWorkInfoByIdLiveData:

val workRequest = OneTimeWorkRequestBuilder<SyncWorker>().build()
WorkManager.getInstance(this).enqueue(workRequest)

WorkManager.getInstance(this)
    .getWorkInfoByIdLiveData(workRequest.id)
    .observe(this) { info ->
        when (info?.state) {
            WorkInfo.State.RUNNING   -> binding.tvStatus.text = "Syncing..."
            WorkInfo.State.SUCCEEDED -> binding.tvStatus.text = "Done!"
            WorkInfo.State.FAILED    -> binding.tvStatus.text = "Failed"
            else                     -> {}
        }
    }

Объединение задач в цепочку

Запускайте задачи последовательно или параллельно с помощью цепочек задач:

val downloadWork  = OneTimeWorkRequestBuilder<DownloadWorker>().build()
val processWork   = OneTimeWorkRequestBuilder<ProcessWorker>().build()
val uploadWork    = OneTimeWorkRequestBuilder<UploadWorker>().build()

// Sequential: download → process → upload
WorkManager.getInstance(context)
    .beginWith(downloadWork)
    .then(processWork)
    .then(uploadWork)
    .enqueue()

// Parallel then merge:
WorkManager.getInstance(context)
    .beginWith(listOf(downloadWork, processWork))  // both run in parallel
    .then(uploadWork)                              // runs after both finish
    .enqueue()

WorkManager и альтернативы

Когда что использовать:

  • WorkManager — отложенные и гарантированно выполняемые задачи с ограничениями. Лучше всего подходит для синхронизации, загрузки данных и очистки.
  • Coroutines / ViewModel — задачи, связанные с открытым приложением. Прекращаются после завершения приложения.
  • AlarmManager — уведомления в точное время (напоминания календаря). Требует внимательной работы с зарядом батареи.
  • Foreground Service — длительные задачи, о которых пользователь знает (воспроизведение музыки, навигация).

Быстрая проверка

Каков минимальный интервал повторения для PeriodicWorkRequest?

Итоги: WorkManager

WorkManager — подходящий инструмент для гарантированно выполняемых фоновых задач:

  • Унаследуйте класс от CoroutineWorker и реализуйте doWork()
  • Возвращайте Result.success(), .failure() или .retry()
  • Используйте OneTimeWorkRequest для однократного запуска и PeriodicWorkRequest для повторяющихся запусков
  • Добавляйте Constraints для работы только по WiFi, при определённом состоянии батареи и т. д.
  • Передавайте данные с помощью workDataOf()
  • Объединяйте задачи в цепочку с помощью beginWith().then().enqueue()

Далее: компоненты Material Design для красивых интерфейсов.

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

Урок «WorkManager и фоновые задачи» бесплатный?

Да — полный текст урока «WorkManager и фоновые задачи» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Android Academy, подпишись на CoddyKit PRO. Курс Android Academy содержит 6 уроков всего.

Чему я научусь в уроке «WorkManager и фоновые задачи»?

Планируйте гарантированное выполнение фоновых задач с помощью WorkManager. Используйте OneTimeWorkRequest, PeriodicWorkRequest, ограничения, передачу данных и цепочки задач. Ты практикуешь Android Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Android Academy?

Предыдущий опыт не требуется. Android Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 5 из 6.

Сколько времени занимает урок «WorkManager и фоновые задачи»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Android Academy?

Да. Каждый урок Android Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Retrofit и REST API
  2. Загрузка изображений с Coil
  3. Обработка ошибок и UX
  4. Push-уведомления
  5. WorkManager и фоновые задачи
  6. Публикация в Play Store
← Назад к Android Academy