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 — локальная установка не требуется.
Все уроки этого курса
- Retrofit и REST API
- Загрузка изображений с Coil
- Обработка ошибок и UX
- Push-уведомления
- WorkManager и фоновые задачи
- Публикация в Play Store