Agendar tarefas com o WorkManager   Parte do Android Jetpack

O WorkManager é a solução recomendada para trabalhos persistentes. O trabalho é persistente quando permanece agendado após as reinicializações do app e do sistema. Como o melhor jeito de realizar a maioria do processamento em segundo plano é por trabalho persistente, o WorkManager é a principal API recomendada para isso.

Tipos de trabalho persistente

O WorkManager processa três tipos de trabalho persistente:

  • Imediato: tarefas que precisam começar imediatamente e terminar em breve. Podem ser priorizados.
  • De longa duração: tarefas que podem ser executadas por mais tempo, potencialmente mais de 10 minutos.
  • Adiável: tarefas programadas que começam posteriormente e podem ser executadas periodicamente.

A Figura 1 descreve como os diferentes tipos de trabalho persistente se relacionam.

O trabalho persistente pode ser imediato, de longa duração ou adiável
Figura 1: tipos de trabalho persistente.

Da mesma forma, a tabela abaixo descreve os vários tipos de trabalho.

Tipo Periodicidade Como acessar
Imediata Uma vez OneTimeWorkRequest e Worker.

Para trabalhos priorizados, chame setExpedited() na OneTimeWorkRequest.

De longa duração Uma vez ou periódico Qualquer WorkRequest ou Worker. Chame setForeground() no worker para processar a notificação.
Adiável Uma vez ou periódico PeriodicWorkRequest e Worker.

Para saber mais sobre como configurar o WorkManager, consulte o guia Como definir WorkRequests.

Recursos

Além de oferecer uma API mais simples e consistente, o WorkManager tem vários outros benefícios importantes:

Restrições de trabalho

Defina de forma declarativa as condições ideais para a execução do trabalho usando restrições de trabalho. Por exemplo, executar apenas quando o dispositivo estiver em uma rede ilimitada, quando o dispositivo estiver ocioso ou com bateria suficiente.

Agendamento robusto

O WorkManager permite que você agende um trabalho para ser executado uma única vez ou repetidamente usando períodos de agendamento flexíveis. O trabalho também pode receber uma tag e um nome, o que possibilita agendar trabalhos exclusivos e substituíveis e monitorar ou cancelar grupos de trabalho ao mesmo tempo.

O trabalho agendado é armazenado em um banco de dados SQLite gerenciado internamente, e o WorkManager se encarrega de garantir que esse trabalho persista e seja agendado novamente durante as reinicializações do dispositivo.

Além disso, o WorkManager está em compliance com os recursos de economia de energia e as práticas recomendadas, como o modo Soneca. Assim, você não precisa se preocupar com esses aspectos.

Trabalho priorizado

Você pode usar o WorkManager a fim de agendar trabalhos imediatos para execução em segundo plano. Use o Trabalho priorizado em tarefas que são importantes para o usuário e podem ser concluídas em poucos minutos.

Política flexível de nova tentativa

Às vezes, o trabalho falha. O WorkManager oferece políticas flexíveis de nova tentativa, incluindo uma política de espera exponencial configurável.

Encadeamento de trabalho

Para trabalhos complexos relacionados, encadeie tarefas de trabalho individuais usando uma interface intuitiva que possibilita controlar quais tarefas são executadas sequencialmente e quais são executadas em paralelo.

Kotlin


val continuation = WorkManager.getInstance(context)
    .beginUniqueWork(
        Constants.IMAGE_MANIPULATION_WORK_NAME,
        ExistingWorkPolicy.REPLACE,
        OneTimeWorkRequest.from(CleanupWorker::class.java)
    ).then(OneTimeWorkRequest.from(WaterColorFilterWorker::class.java))
    .then(OneTimeWorkRequest.from(GrayScaleFilterWorker::class.java))
    .then(OneTimeWorkRequest.from(BlurEffectFilterWorker::class.java))
    .then(
        if (save) {
            workRequest<SaveImageToGalleryWorker>(tag = Constants.TAG_OUTPUT)
        } else /* upload */ {
            workRequest<UploadWorker>(tag = Constants.TAG_OUTPUT)
        }
    )

Java


WorkManager.getInstance(...)
.beginWith(Arrays.asList(workA, workB))
.then(workC)
.enqueue();

Para cada tarefa de trabalho, é possível definir dados de entrada e saída do trabalho em questão. Ao encadear trabalhos, o WorkManager transmite automaticamente os dados de saída de uma tarefa de trabalho à próxima.

Interoperabilidade de linha de execução integrada

O WorkManager se integra perfeitamente a corrotinas e ao RxJava e oferece a flexibilidade de conectar suas próprias APIs assíncronas.

Usar o WorkManager para trabalhos confiáveis

O WorkManager é destinado ao trabalho que precisa ser executado de forma confiável, mesmo que o usuário saia de uma tela, o app seja encerrado ou o dispositivo seja reiniciado. Por exemplo:

  • ao enviar registros ou análises para serviços de back-end;
  • na sincronização periódica de dados do app com um servidor.

O WorkManager não se destina a trabalhos em andamento em segundo plano que podem ser encerrados com segurança quando o processo do app é encerrado. Ele também não é uma solução geral para todo trabalho que exige execução imediata. Consulte o guia de processamento em segundo plano para ver qual solução atende às suas necessidades.

Relação com outras APIs

Embora as corrotinas sejam a solução recomendada para certos casos de uso, o mesmo não acontece para trabalhos persistentes. É importante observar que as corrotinas são uma estrutura de simultaneidade, enquanto o WorkManager é uma biblioteca de trabalho persistente. Da mesma forma, use o AlarmManager apenas para relógios ou agendas.

API Recomendada para Relação com o WorkManager
Corrotinas Todo trabalho assíncrono que não precisa ser persistente. As corrotinas são a forma padrão de sair da linha de execução principal no Kotlin. No entanto, elas saem da memória quando o app é fechado. Para trabalhos persistentes, use o WorkManager.
AlarmManager Apenas alarmes. Ao contrário do WorkManager, o AlarmManager ativa um dispositivo no modo Soneca. Portanto, ele não é eficiente em termos de gerenciamento de recursos e energia. Não o use para trabalhos em segundo plano, apenas para alarmes ou notificações precisos, como eventos da agenda.

Substituir APIs descontinuadas

É recomendado usar a API WorkManager para substituir todas as APIs anteriores de agendamento em segundo plano do Android, incluindo FirebaseJobDispatcher, GcmNetworkManager e Job Scheduler.

Começar

Consulte o Guia de iniciação para começar a usar o WorkManager no app.

Outros recursos

Para mais informações sobre o WorkManager, consulte os recursos a seguir.

Exemplos

Vídeos

Blogs