WorkManager é uma biblioteca Android Jetpack projetada para executar tarefas adiadas e em segundo plano com execução garantida. Ao contrário de Service ou JobScheduler, o WorkManager gerencia o ciclo de vida da tarefa: reinicia em caso de falha, adapta-se à versão do Android e leva em conta as restrições do dispositivo. De acordo com Android Developers, 2026, o WorkManager é a solução preferida para a maioria das operações em segundo plano no desenvolvimento moderno de Android.
Pontos-chave
WorkManager faz parte do Android Jetpack, uma biblioteca para gerenciar tarefas em segundo plano que devem ser executadas com garantia, independentemente de o aplicativo estar em primeiro plano ou ter sido fechado pelo usuário. A biblioteca suporta API 14+ e seleciona automaticamente o mecanismo de execução apropriado: JobScheduler no Android 5+, BroadcastReceiver + AlarmManager em versões mais antigas.
A principal característica do WorkManager é a execução garantida. Se uma tarefa não foi concluída devido a reinicialização do dispositivo, fechamento do aplicativo ou falha, o WorkManager a reiniciará na primeira oportunidade. Isso torna a biblioteca uma escolha ideal para tarefas críticas de execução: envio de análises, sincronização de banco de dados, upload de logs.
Ao contrário do Background Service, o WorkManager não requer gerenciamento de threads e ciclo de vida. A própria biblioteca cria um pool de threads, lida com o Modo Doze, leva em conta a versão do Android e fornece uma API unificada independentemente do nível de API. O suporte a corrotinas e RxJava está disponível através de CoroutineWorker e RxWorker, respectivamente.
O WorkManager fornece suporte integrado para LiveData para rastrear o estado das tarefas. O método getWorkInfoByIdLiveData retorna LiveData<WorkInfo> que é atualizada a cada mudança de estado: ENQUEUED, RUNNING, SUCCEEDED, FAILED, CANCELLED. Isso permite que os componentes da UI reajam a mudanças sem consulta manual do agendador e sem vazamentos de memória graças aos componentes Lifecycle-aware.
WorkManager.getInstance(context)
.getWorkInfoByIdLiveData(syncRequest.id)
.observe(viewLifecycleOwner) { workInfo ->
when (workInfo.state) {
WorkInfo.State.SUCCEEDED ->
showSuccess()
WorkInfo.State.FAILED ->
showError(workInfo.outputData)
else ->
showProgress()
}
}
A arquitetura do WorkManager é construída em torno de três classes base: Worker, WorkRequest e WorkManager. O Worker contém a lógica da tarefa, o WorkRequest descreve os parâmetros de execução e o WorkManager gerencia a fila e o agendamento. A biblioteca usa um banco de dados Room interno para armazenar o estado de todas as tarefas.
Worker é uma classe abstrata com um único método doWork que é chamado em uma thread em segundo plano. O método retorna ListenableWorker.Result — SUCCESS, FAILURE ou RETRY. O WorkRequest vincula o Worker com parâmetros: tempo limite, tag, atraso inicial e restrições.
class SyncWorker(
context: Context,
params: WorkerParameters
) : Worker(context, params) {
override fun doWork(): Result {
return try {
val api = RetrofitClient.api
val response = api.syncData()
Result.success()
} catch (e: Exception) {
Result.retry()
}
}
}
WorkManager agenda tarefas de forma uniforme, independentemente da versão do Android. Ao chamar enqueue, a biblioteca salva a tarefa no Room, avalia as condições atuais e seleciona o momento ideal de execução. Internamente, pode usar JobScheduler, AlarmManager ou seu próprio agendador — o desenvolvedor não precisa se preocupar com isso.
val syncRequest = OneTimeWorkRequestBuilder<SyncWorker>()
.setInitialDelay(15, TimeUnit.MINUTES)
.addTag("sync")
.build()
WorkManager.getInstance(context)
.enqueue(syncRequest)
WorkManager suporta dois tipos de solicitações de execução: únicas e periódicas. A escolha do tipo depende do cenário: a tarefa deve ser executada uma vez ou repetida em um intervalo determinado.
OneTimeWorkRequest é projetado para tarefas que devem ser executadas uma única vez. Pode ser o envio de um log, sincronização de dados após autorização, download de configuração no primeiro início. O atraso é definido via setInitialDelay e as restrições via setConstraints.
PeriodicWorkRequest é adequado para tarefas repetitivas com intervalo mínimo de 15 minutos. A biblioteca garante que o intervalo entre execuções não será menor que o especificado, mas pode ser maior devido a restrições do dispositivo. Para tarefas com frequência inferior a 15 minutos, use Handler ou Timer no Foreground Service.
| Parâmetro | OneTimeWorkRequest | PeriodicWorkRequest |
|---|---|---|
| Frequência | única | repetida (mín. 15 min) |
| Quantidade | 1 execução | até cancelamento |
| Atraso | setInitialDelay | setInitialDelay |
| Cadeias | suporta | não |
| Uso | download, sincronização | monitoramento, sondagem |
As restrições no WorkManager permitem definir condições sob as quais uma tarefa pode ser iniciada: conexão de rede (NetworkType), nível de bateria (batteryNotLow), estado do armazenamento (StorageNotLow) e modo ocioso (DeviceIdle). A tarefa não será iniciada até que todas as restrições sejam atendidas.
val constraints = Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.setRequiresCharging(true)
.setRequiresBatteryNotLow(true)
.build()
val request = OneTimeWorkRequestBuilder<ImageUploadWorker>()
.setConstraints(constraints)
.build()
As cadeias permitem organizar a execução sequencial ou paralela de tarefas. beginWith inicia uma cadeia, em seguida, adiciona o próximo Worker que será executado após a conclusão bem-sucedida do anterior. Para execução paralela, use workManager.enqueue(listOf(request1, request2)).
WorkManager.getInstance(context)
.beginWith(compressWorker)
.then(uploadWorker)
.then(cleanupWorker)
.enqueue()
// compress -> upload -> cleanup sequencialmente
JobScheduler foi introduzido no Android 5 (API 21) como um serviço de sistema para agendar tarefas em segundo plano. O WorkManager veio para substituí-lo, oferecendo uma API multiplataforma com migração automática e capacidades adicionais: cadeias, garantia de execução, tags, observação de estado via LiveData.
Ao migrar do JobScheduler para WorkManager, você precisará converter JobService em Worker, substituir JobInfo por WorkRequest e Context.getSystemService pela API do WorkManager. O WorkManager lida automaticamente com problemas de compatibilidade e lida com o Modo Doze de forma mais correta do que uma implementação manual de JobScheduler. Passos da migração: 1) criar uma classe Worker, 2) construir um WorkRequest com as mesmas condições, 3) remover JobService e JobInfo do código e manifesto.
WorkManager suporta o conceito de tarefas únicas através de ExistingWorkPolicy. Se uma tarefa com o nome especificado já existir, a política determina o comportamento: KEEP (não criar uma nova), REPLACE (substituir a existente), APPEND (adicionar ao final da cadeia) e APPEND_OR_REPLACE. UniqueWorkRequest é conveniente para tarefas que não devem ser duplicadas: sincronização de banco de dados, download de configuração, envio de lote de análises.
WorkManager.getInstance(context)
.enqueueUniqueWork(
"sync_data",
ExistingWorkPolicy.KEEP,
syncRequest
)
CoroutineWorker suporta o mecanismo setProgress, permitindo passar resultados intermediários de execução. Isso é útil para operações longas: download de arquivo grande, processamento em lote de imagens, migração de banco de dados. A UI pode se inscrever em atualizações via getWorkInfosByTagLiveData e exibir o progresso em tempo real. O método ForegroundInfo também está disponível para executar um Worker como Foreground Service com uma notificação se a tarefa deve ser visível ao usuário.
class ProgressWorker(
context: Context,
params: WorkerParameters
) : CoroutineWorker(context, params) {
override suspend fun doWork(): Result {
val total = 100
for (i in 1..total) {
setProgress(
workDataOf("progress" to i)
)
}
return Result.success()
}
}
WorkManager suporta transferência de dados entre Workers via InputData e OutputData. InputData é criado durante a construção do WorkRequest através de Data.Builder e é passado para o Worker através de inputData. Após a execução, o Worker cria OutputData via workDataOf ou Data.Builder e retorna junto com Result.success(outputData). O próximo Worker na cadeia recebe o outputData do anterior como seu inputData. Os dados são armazenados no formato chave-valor com suporte para tipos básicos: String, Int, Long, Boolean, Double. O tamanho máximo de Data é 10 KB.
Na prática, muitos projetos usam WorkManager como o único agendador de tarefas em segundo plano. O Google recomenda migrar todos os JobService existentes para WorkManager, especialmente em aplicativos que suportam Android 4.4 (API 19) e inferiores, onde o JobScheduler não está disponível e o WorkManager usa um mecanismo de fallback via AlarmManager e BroadcastReceiver. Para testes, o WorkManager fornece TestListenableWorkerBuilder e TestWorkerBuilder, que permitem testar Workers em testes JUnit sem um agendador real.
Para testar o WorkManager, use TestListenableWorkerBuilder do AndroidX Test, que permite executar Workers em um ambiente isolado e verificar o Result retornado. A biblioteca fornece suporte completo para JUnit e Robolectric para testes unitários sem um agendador real. No geral, o WorkManager é adequado para 80% das tarefas onde antes eram usados Service ou JobScheduler.
Perguntas frequentes
Sim, o WorkManager garante a execução mesmo após a reinicialização. A biblioteca salva todas as tarefas incompletas em um banco de dados Room e as restaura usando BroadcastReceiver que é acionado após a inicialização do sistema.
Worker executa em uma thread em segundo plano sem suporte a corrotinas ou RxJava. CoroutineWorker usa corrotinas Kotlin com suporte a funções suspend e cancelamento via escopo de corrotina. RxWorker trabalha com Observable e Single, adequado para cadeias reativas.
Use workManager.cancelWorkById(id) ou workManager.cancelAllWorkByTag("tag"). A biblioteca também fornece o método cancelUniqueWork("name") para cancelar tarefas únicas com o nome especificado.
O intervalo mínimo para PeriodicWorkRequest é de 15 minutos. Esta limitação é definida pelo Google para evitar consumo excessivo de bateria. Se uma tarefa precisar ser executada com mais frequência, use Foreground Service ou Handler com um temporizador.
Sim, o WorkManager suporta API 14+. Em dispositivos sem JobScheduler (abaixo de API 21), a biblioteca usa uma combinação de AlarmManager e BroadcastReceiver para agendamento de tarefas. Isso torna o WorkManager uma solução universal para tarefas em segundo plano.
Resumo
Vamos desenvolver um aplicativo móvel chave na mão
A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.
Leia também