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.
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
- Workmanager - MAD Skills, série de vídeos (em inglês)
- Como trabalhar com o WorkManager (em inglês), da Conferência de Desenvolvedores Android 2018
- WorkManager: além dos princípios básicos (em inglês), da Conferência de Desenvolvedores Android 2019