Os apps geralmente precisam fazer mais de uma coisa por vez. As APIs do Android oferecem várias maneiras diferentes de fazer isso. Escolher a opção certa é muito importante. Uma opção pode ser certa para uma situação, mas muito errada para outra. Escolher as APIs erradas pode prejudicar o desempenho do app ou a eficiência dos recursos, o que pode esgotar a bateria e prejudicar o desempenho do dispositivo do usuário como um todo. Em alguns casos, a escolha da abordagem errada pode impedir que seu app seja listado na Play Store.
Este documento explica as diferentes opções disponíveis e ajuda você a escolher a opção certa para sua situação.
Terminologia
Alguns termos importantes relacionados a tarefas em segundo plano podem ser usados de várias maneiras contraditórias. Por isso, é importante definir nossos termos.
Se um app estiver em execução em segundo plano, o sistema vai colocar um número de restrições nele. Por exemplo, na maioria dos casos, um app em segundo plano não pode iniciar serviços em primeiro plano.
Para os fins deste documento, vamos usar o termo "tarefa" para indicar uma operação que um app está realizando fora do fluxo de trabalho principal. Para garantir o alinhamento no entendimento, dividimos isso em três categorias principais de tipos de tarefas: trabalho assíncrono, as APIs de programação de tarefas e os serviços em primeiro plano.
Escolha a opção certa
Na maioria dos casos, é possível descobrir as APIs certas para usar na tarefa identificando a categoria (trabalho assíncrono, APIs de agendamento de tarefas ou serviços em primeiro plano) em que a tarefa se enquadra.
Se ainda não tiver certeza, use os diagramas de fluxo que fornecemos para adicionar mais nuances à decisão. Cada uma dessas opções é descrita com mais detalhes mais adiante neste documento.
Há dois cenários principais para tarefas em segundo plano:
- A tarefa iniciada pelo usuário enquanto o app está visível
- A tarefa é iniciada em resposta a um evento, interno ou externo
Esses dois cenários têm árvores de decisão próprias.
Trabalho assíncrono
Em muitos casos, um app só precisa fazer operações simultâneas enquanto está em execução em primeiro plano. Por exemplo, um app pode precisar fazer um cálculo demorado. Se o cálculo fosse feito na linha de execução da interface, o usuário não poderia interagir com o app até que o cálculo fosse concluído. Isso poderia resultar em um erro ANR. Em um caso como esse, o app precisa usar uma opção de trabalho assíncrono.
As opções de trabalho assíncrono comuns incluem corrotinas do Kotlin e linhas de execução Java. Encontre mais informações na documentação sobre trabalho assíncrono. É importante observar que, diferente das APIs de tarefas em segundo plano, o trabalho assíncrono não tem garantia de conclusão se o app deixar de estar em um estágio de ciclo de vida válido (por exemplo, se o app sair do primeiro plano).
APIs de agendamento de tarefas
As APIs de programação de tarefas são uma opção mais flexível quando você precisa fazer tarefas
que precisam
continuar mesmo que o usuário saia do app. Na maioria dos casos, a melhor opção para
executar tarefas em segundo plano é usar o WorkManager,
embora em alguns casos seja apropriado usar a API
JobScheduler
da plataforma.
O WorkManager é uma biblioteca poderosa que permite configurar trabalhos simples ou complicados conforme necessário. Você pode usar o WorkManager para programar a execução de tarefas em horários específicos ou especificar as condições em que a tarefa precisa ser executada. Você pode até configurar cadeias de tarefas para que cada uma seja executada por vez, transmitindo os resultados para a próxima. Para entender todas as opções disponíveis, leia a lista de recursos do WorkManager.
Alguns dos cenários mais comuns para tarefas em segundo plano incluem:
- Buscar dados do servidor periodicamente
- Buscar dados do sensor (por exemplo, dados do pedômetro)
- Receber dados de local periódicos (é necessário ter a
permissão
ACCESS_BACKGROUND_LOCATION
no Android 10 ou mais recente) - Fazer upload de conteúdo com base em um gatilho, como fotos criadas pela câmera
Serviços em primeiro plano
Os serviços em primeiro plano oferecem uma maneira poderosa de executar tarefas imediatamente que não precisam ser interrompidas. No entanto, os serviços em primeiro plano podem sobrecarregar o dispositivo e, às vezes, têm implicações de privacidade e segurança. Por esses motivos, o sistema impõe muitas restrições sobre como e quando os apps podem usar serviços em primeiro plano. Por exemplo, um serviço em primeiro plano precisa ser perceptível para o usuário e, na maioria dos casos, os apps não podem iniciar serviços em primeiro plano quando estão em segundo plano. Para mais informações, consulte a documentação de serviços em primeiro plano.
Há dois métodos para criar um serviço em primeiro plano. É possível declarar seu
próprio Service
e especificar que o serviço é
um serviço em primeiro plano chamando
Service.startForeground()
. Como alternativa, use
o WorkManager para criar um serviço em primeiro plano, conforme discutido em suporte a
workers de longa duração.
No entanto, é importante saber que um serviço em primeiro plano criado pelo WorkManager
precisa obedecer a todas as mesmas restrições que qualquer outro serviço em primeiro plano.
O WorkManager fornece apenas algumas APIs de conveniência para facilitar a criação de um
serviço em primeiro plano.
APIs alternativas
O sistema oferece APIs alternativas projetadas para ter melhor desempenho em casos de uso mais específicos. Se houver uma API alternativa para seu caso de uso, recomendamos usar essa API em vez de um serviço em primeiro plano, porque ela pode ajudar a melhorar o desempenho do app. A documentação de tipos de serviços em primeiro plano informa quando há uma boa API alternativa para usar em vez de um tipo de serviço em primeiro plano específico.
Alguns dos cenários mais comuns para o uso de APIs alternativas são:
- Usar transferências de dados iniciadas pelo usuário para fazer downloads ou uploads grandes, em vez de criar um serviço em primeiro plano de sincronização de dados
- Usar o gerenciador de dispositivo complementar para pareamento e transferência de dados por Bluetooth em vez de um serviço em primeiro plano de dispositivo conectado
- Usar o modo picture-in-picture para reproduzir vídeos em vez de criar um serviço em primeiro plano de reprodução de mídia
Tarefas iniciadas pelo usuário
Se um app precisar realizar tarefas em segundo plano e a operação for iniciada pelo usuário enquanto o app estiver visível, responda a estas perguntas para encontrar a abordagem certa.
A tarefa precisa continuar sendo executada enquanto o app está em segundo plano?
Se a tarefa não precisar continuar em execução enquanto o app estiver em segundo plano, use o trabalho assíncrono. Há várias opções para fazer trabalhos assíncronos. O importante é entender que todas essas opções param de operar se o app for para segundo plano. Elas também são interrompidas se o app for fechado. Por exemplo, um app de rede social pode atualizar o feed de conteúdo, mas não precisa concluir a operação se o usuário sair da tela.
A experiência do usuário será ruim se a tarefa for adiada ou interrompida?
É importante considerar se a experiência do usuário seria prejudicada se uma tarefa fosse adiada ou cancelada. Por exemplo, se um app precisar atualizar os recursos, o usuário pode não perceber se a operação acontece imediatamente ou no meio da noite enquanto o dispositivo está sendo recarregado. Em casos como esse, use as opções de trabalho em segundo plano.
É uma tarefa curta e essencial?
Se a tarefa não puder ser adiada e for concluída rapidamente, use um
serviço em primeiro plano com o tipo
shortService
. Esses
serviços são mais fáceis de criar do que outros serviços em primeiro plano e não exigem
tantas permissões. No entanto, os serviços curtos precisam ser concluídos em três minutos.
Existe uma API alternativa apenas para essa finalidade?
Se a tarefa não for invisível para o usuário, a solução correta pode ser usar um serviço em primeiro plano. Esses serviços são executados continuamente após o início, então são uma boa escolha quando interromper a tarefa causaria uma experiência ruim para o usuário. Por exemplo, um app de monitoramento de atividades físicas pode usar sensores de localização para permitir que os usuários registrem o trajeto de corrida em um mapa. Não faça isso com uma opção de trabalho em segundo plano, porque, se a tarefa for pausada, o rastreamento será interrompido imediatamente. Em uma situação como essa, um serviço em primeiro plano é o mais recomendado.
No entanto, como os serviços em primeiro plano podem usar muitos recursos do dispositivo, o sistema impõe muitas restrições sobre quando e como eles podem ser usados. Em muitos casos, em vez de usar um serviço em primeiro plano, você pode usar uma API alternativa que processa o job para você com menos problemas. Por exemplo, se o app precisar realizar uma ação quando o usuário chegar a um determinado local, a melhor opção é usar a API Geofence em vez de rastrear a localização do usuário com um serviço em primeiro plano.
Tarefas em resposta a um evento
Às vezes, um app precisa fazer um trabalho em segundo plano em resposta a um gatilho, como:
- Mensagens de transmissão
- Mensagens do Firebase Cloud Messaging (FCM)
- Alarmes definidos pelo app
Isso pode ser um gatilho externo (como uma mensagem do FCM) ou uma resposta a um alarme definido pelo próprio app. Por exemplo, um jogo pode receber uma mensagem do FCM informando que alguns recursos precisam ser atualizados.
Se você tiver certeza de que a tarefa será concluída em alguns segundos, use o trabalho assíncrono para realizar a tarefa. O sistema vai permitir que seu app tenha alguns segundos para realizar essas tarefas, mesmo que ele esteja em segundo plano.
Se a tarefa demorar mais do que alguns segundos, talvez seja apropriado iniciar um serviço em primeiro plano para processá-la. Na verdade, mesmo que o app esteja em segundo plano, ele pode ser permitido para iniciar um serviço em primeiro plano, se a tarefa foi acionada pelo usuário e se ela se enquadra em uma das isenções de restrições de início em segundo plano aprovadas. Por exemplo, se um app receber uma mensagem FCM de alta prioridade, ele poderá iniciar um serviço em primeiro plano mesmo que esteja em segundo plano.
Se a tarefa demorar mais do que alguns segundos, use as APIs de programação de tarefas.