Programação de tarefas

Quando você quiser executar tarefas que continuem sendo executadas mesmo que o app saia do estado visível, recomendamos usar a biblioteca WorkManager do Jetpack. O WorkManager tem um mecanismo de programação robusto que permite que as tarefas persistam durante as reinicializações do app e do dispositivo.

Tipos de trabalho

O WorkManager processa três tipos de trabalho:

  • 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 tarefas se relacionam.

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

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.
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 do WorkManager

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

Esta tabela mostra como o WorkManager se relaciona com APIs semelhantes. Essas informações podem ajudar você a escolher a API certa para os requisitos do seu app.

API Recomendado para Relação com o WorkManager
Corrotinas Todo trabalho assíncrono que não precisa ser persistente se o app sair do estado visível. As corrotinas são a forma padrão de sair da linha de execução principal no Kotlin. No entanto, elas são interrompidas assim que o app é fechado. Para trabalhos que precisam persistir mesmo depois que o app é fechado, use o WorkManager.
AlarmManager Apenas alarmes. Ao contrário dos workers regulares do WorkManager, os alarmes exatos do AlarmManager ativam um dispositivo no modo Soneca. Portanto, ele não é eficiente em termos de gerenciamento de recursos e energia. Não o use para trabalhos recorrentes em segundo plano, apenas para alarmes ou notificações precisos, como eventos da agenda.

Substituir APIs descontinuadas

A API WorkManager é a substituta recomendada para as APIs anteriores de agendamento em segundo plano do Android, incluindo FirebaseJobDispatcher e GcmNetworkManager.

Primeiros passos

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

Outros recursos

Confira mais recursos nas seções a seguir.

Vídeos

Blogs

Amostras