Visão geral das tarefas em segundo plano

Os apps geralmente precisam fazer mais de uma coisa por vez. As APIs do Android oferecem várias maneiras de fazer isso. Escolher a opção certa é muito importante. Uma opção pode ser adequada para uma situação, mas totalmente errada para outra. Escolher as APIs erradas pode prejudicar o desempenho ou a eficiência de recursos do app, o que pode descarregar a bateria e prejudicar o desempenho do dispositivo do usuário como um todo. Em alguns casos, escolher a abordagem errada pode impedir que o app seja listado na Google Play Store.

Neste documento, explicamos as diferentes opções disponíveis e ajudamos você a escolher a mais adequada 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 aplicar várias restrições a ele. 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, usaremos o termo "tarefa" para indicar uma operação que um app está realizando fora do fluxo de trabalho principal. Para garantir o alinhamento na compreensão, dividimos isso em três categorias principais de tipos de tarefas: trabalho assíncrono, APIs de programação de tarefas e serviços em primeiro plano.

Escolha a opção certa

Na maioria dos cenários, é possível descobrir as APIs certas para sua tarefa descobrindo a categoria (trabalho assíncrono, as APIs de agendamento de tarefas ou serviços em primeiro plano) em que a tarefa se enquadra.

Se ainda tiver dúvidas, use os fluxogramas que fornecemos, que adicionam mais nuances à decisão. Cada uma dessas opções é descrita em mais detalhes posteriormente neste documento.

Há dois cenários principais a serem considerados para tarefas em segundo plano:

Esses dois cenários têm as próprias árvores de decisão.

Trabalho assíncrono

Em muitos casos, um app só precisa realizar 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 de interface, o usuário não conseguiria interagir com o app até que o cálculo fosse concluído, o que poderia resultar em um erro de ANR. Nesse caso, o app precisa usar uma opção de trabalho assíncrono.

As opções comuns de trabalho assíncrono incluem corrotinas do Kotlin e linhas de execução do Java. Encontre mais informações na documentação sobre trabalho assíncrono. É importante observar que, ao contrário das API Tasks, 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 realizar 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 avançada que permite configurar jobs simples ou complicados, conforme necessário. Você pode usar o WorkManager para programar tarefas para serem executadas em horários específicos ou especificar as condições em que a tarefa precisa ser executada. É possível até mesmo 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 contador de passos)
  • 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 acionador de conteúdo, como fotos criadas pela câmera

Serviços em primeiro plano

Os serviços em primeiro plano oferecem uma maneira eficiente de executar tarefas imediatamente que não devem 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 para workers de longa duração. No entanto, é importante saber que um serviço em primeiro plano criado pelo WorkManager precisa obedecer às mesmas restrições que qualquer outro serviço em primeiro plano. O WorkManager apenas fornece algumas APIs de conveniência para simplificar a criação de um serviço em primeiro plano.

APIs alternativas

O sistema oferece APIs alternativas projetadas para ter um desempenho melhor em casos de uso mais específicos. Se houver uma API alternativa para seu caso de uso, recomendamos usá-la em vez de um serviço em primeiro plano, porque isso ajuda a melhorar o desempenho do app. A documentação sobre tipos de serviços em primeiro plano indica quando há uma boa API alternativa para usar em vez de um tipo específico de serviço em primeiro plano.

Alguns dos cenários mais comuns para o uso de APIs alternativas são:

Tarefas iniciadas pelo usuário

Fluxograma mostrando como escolher a API adequada. Este gráfico
  resume o material na seção "Tarefas iniciadas pelo usuário".
Figura 1: como escolher a API certa para executar uma tarefa em segundo plano iniciada pelo usuário.

Se um app precisa realizar tarefas em segundo plano e a operação é iniciada pelo usuário enquanto o app está visível, responda a estas perguntas para encontrar a abordagem correta.

A tarefa precisa continuar em execução 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 realizar trabalho assíncrono. É importante entender que todas essas opções deixam de funcionar se o app entra em segundo plano. Eles também são interrompidos se o app for encerrado. 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 será prejudicada se uma tarefa for adiada ou cancelada. Por exemplo, se um app precisar atualizar os recursos, o usuário pode não notar se a operação acontecer imediatamente ou no meio da noite, enquanto o dispositivo está carregando. Nesses casos, use as opções de trabalho em segundo plano.

É uma tarefa curta e crítica?

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 até 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 depois de iniciados. Por isso, são uma boa opção quando a interrupção da tarefa prejudica a experiência do 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 é recomendável fazer isso com uma opção de trabalho em segundo plano, porque, se a tarefa for pausada, o rastreamento será interrompido imediatamente. Nesse tipo de situação, um serviço em primeiro plano é a melhor opção.

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 o local do usuário com um serviço em primeiro plano.

Tarefas em resposta a um evento

Fluxograma mostrando como escolher a API adequada. Este gráfico
  resume o material na seção "Tarefas em resposta a um evento".
Figura 2: como escolher a API certa para executar uma tarefa em segundo plano acionada por evento.

Às vezes, um app precisa realizar um trabalho em segundo plano em resposta a um acionador, como:

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 para atualizar alguns recursos.

Se você tiver certeza de que a tarefa será concluída em alguns segundos, use o trabalho assíncrono para executá-la. O sistema vai permitir que o app execute essas tarefas por alguns segundos, mesmo que esteja em segundo plano.

Se a tarefa levar mais do que alguns segundos, pode ser apropriado iniciar um serviço em primeiro plano para processá-la. Na verdade, mesmo que o app esteja em segundo plano, ele pode ter permissão para iniciar um serviço em primeiro plano se a tarefa tiver sido acionada pelo usuário e se enquadrar em uma das isenções aprovadas das restrições de início em segundo plano. Por exemplo, se um app receber uma mensagem de alta prioridade do FCM, ele poderá iniciar um serviço em primeiro plano, mesmo que esteja em segundo plano.

Se a tarefa levar mais do que alguns segundos, use as APIs de programação de tarefas.