0Pricing
Android Academy · Aula

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 CoroutineWorker e implemente doWork()
  • Retorne Result.success(), .failure() ou .retry()
  • Use OneTimeWorkRequest para execuções únicas e PeriodicWorkRequest para execuções recorrentes
  • Adicione Constraints para 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

  1. Retrofit e APIs REST
  2. Carregamento de imagens com Coil
  3. Tratamento de erros e experiência do usuário
  4. Notificações push
  5. WorkManager e tarefas em segundo plano
  6. Publicação na Play Store
← Voltar para Android Academy