WorkManager e tarefas em segundo plano
Agende trabalho garantido em segundo plano com WorkManager. Use OneTimeWorkRequest, PeriodicWorkRequest, restrições, passagem de dados e encadeamento de trabalhos.
WorkManager e tarefas em segundo plano é uma aula grátis de Android Academy no CoddyKit. Esta é a aula 5 de 6. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Android Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Android Academy inclui 6 aulas no total.
Tarefas em segundo plano no Android
O Android restringe agressivamente as tarefas em segundo plano para economizar bateria. Antes do WorkManager, os desenvolvedores usavam:
- AsyncTask (obsoleto)
- AlarmManager (não confiável após reinicializações ou no modo Doze)
- JobScheduler (API complexa)
- Serviços (podem ser encerrados e não permitem novas tentativas)
O WorkManager é a solução recomendada para tarefas em segundo plano adiáveis e garantidas.
O que é o WorkManager?
O WorkManager garante que sua tarefa seja executada mesmo se o aplicativo for encerrado ou o dispositivo for reiniciado. Ele:
- Preserva as tarefas após reinicializações
- Tenta novamente automaticamente em caso de falha
- Oferece suporte a restrições (somente WiFi, somente durante o carregamento etc.)
- Funciona na API 14+
- Integra-se às corrotinas do Kotlin por meio de
CoroutineWorker
Configuração
Adicione o WorkManager a app/build.gradle:
dependencies {
implementation 'androidx.work:work-runtime-ktx:2.9.0'
}Criando um Worker
Estenda CoroutineWorker e implemente doWork(). Retorne Result.success(), Result.failure() ou 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
Agende uma tarefa única e coloque-a na fila:
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
Agende tarefas repetidas. O intervalo mínimo é de 15 minutos:
val periodicSync = PeriodicWorkRequestBuilder<SyncWorker>(
repeatInterval = 1, TimeUnit.HOURS
).build()
WorkManager.getInstance(context).enqueueUniquePeriodicWork(
"hourly_sync",
ExistingPeriodicWorkPolicy.KEEP,
periodicSync
)Restrições
Execute a tarefa somente quando as condições forem atendidas — bateria não fraca, WiFi conectado etc.:
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)Dados de entrada e saída
Passe dados para dentro e para fora de um Worker usando objetos 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)
}
}Observando o status da tarefa
Observe o progresso da tarefa usando 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 -> {}
}
}Encadeando tarefas
Execute tarefas sequencialmente ou em paralelo usando cadeias de tarefas:
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 versus alternativas
Quando usar cada opção:
- WorkManager — tarefas adiáveis, garantidas e baseadas em restrições. Ideal para sincronizações, carregamentos e limpeza.
- Coroutines / ViewModel — tarefas vinculadas ao aplicativo aberto. Param quando o aplicativo é encerrado.
- AlarmManager — alarmes para horários exatos (lembretes de calendário). Exige um controle cuidadoso da bateria.
- Serviço em primeiro plano — tarefas longas das quais o usuário tem conhecimento (reprodução de música, navegação).
Verificação rápida
Qual é o intervalo mínimo de repetição de um PeriodicWorkRequest?
Recapitulação: WorkManager
O WorkManager é a ferramenta adequada para tarefas em segundo plano garantidas:
- Estenda
CoroutineWorkere implementedoWork() - Retorne
Result.success(),.failure()ou.retry() - Use
OneTimeWorkRequestpara execuções únicas ePeriodicWorkRequestpara execuções recorrentes - Adicione
Constraintspara WiFi exclusivo, condições da bateria etc. - Passe dados com
workDataOf() - Encadeie tarefas com
beginWith().then().enqueue()
Próximo: componentes do Material Design para interfaces bonitas.
Perguntas Frequentes
A aula “WorkManager e tarefas em segundo plano” é grátis?
Sim — o texto completo de “WorkManager e tarefas em segundo plano” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Android Academy, atualize para CoddyKit PRO. O curso de Android Academy inclui 6 aulas no total.
O que vou aprender em “WorkManager e tarefas em segundo plano”?
Agende trabalho garantido em segundo plano com WorkManager. Use OneTimeWorkRequest, PeriodicWorkRequest, restrições, passagem de dados e encadeamento de trabalhos. Você pratica Android Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Android Academy?
Nenhuma experiência prévia é necessária. Android Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 5 de 6.
Quanto tempo leva a aula “WorkManager e tarefas em segundo plano”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Android Academy?
Sim. Cada aula de Android Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Retrofit e APIs REST
- Carregamento de imagens com Coil
- Tratamento de erros e experiência do usuário
- Notificações push
- WorkManager e tarefas em segundo plano
- Publicação na Play Store