Esta página sugere algumas práticas recomendadas para configurar tarefas em segundo plano com comportamento adequado. Essas práticas recomendadas visam especificamente reduzir o consumo de bateria, mas também podem melhorar o desempenho do dispositivo de outras maneiras, como redução do uso da rede.
Escolher as restrições ideais e combinar tarefas
Para minimizar a carga que suas tarefas colocam no dispositivo, é importante especificar
restrições ideais. Para tarefas do JobScheduler, consulte JobInfo.Builder
para
ver a lista de restrições. Por exemplo, se você quiser garantir que o app
não acabe com a bateria, é recomendável especificar a restrição
RequiresCharging
. Essa restrição instrui o sistema a não executar o job, a menos que o
nível da bateria esteja realmente aumentando. Da mesma forma, o uso de Wi-Fi geralmente requer
menos energia do que os dados móveis. Portanto, se a tarefa precisar de uma conexão de rede, mas puder
aguardar até que uma rede ilimitada esteja disponível, é recomendável definir uma
restrição NetworkType.UNMETERED
.
Além disso, se você tem várias tarefas semelhantes que se enquadram nas mesmas restrições, é recomendável combiná-las em uma única tarefa para que o dispositivo só seja ativado uma vez. Por exemplo, suponha que seu app tenha três conjuntos de dados diferentes que ele precise sincronizar com o armazenamento em nuvem. Em vez de programar três tarefas diferentes, uma para cada conjunto de dados, geralmente é melhor agendar uma única tarefa "sincronizar os dados", definir restrições apropriadas e deixar que essa tarefa faça toda a sincronização de dados pendentes quando for executada.
Dito isso, não tente combinar tarefas não relacionadas em uma única tarefa que faz tudo. Em vez disso, certifique-se de fornecer as restrições apropriadas a cada tarefa. Por exemplo, se as tarefas forem de baixa prioridade, especifique que elas precisam ser executadas quando o dispositivo estiver inativo e carregando. Dessa forma, mesmo que o dispositivo seja ativado várias vezes, isso não prejudicará a experiência do usuário nem afetará a duração da bateria.
Marque tarefas como aceleradas somente quando elas forem urgentes.
Se uma tarefa for particularmente urgente, você pode marcá-la como acelerada. Para
tarefas do JobScheduler, chame JobInfo.Builder.setExpedited(true)
. Isso
prioriza a tarefa de várias maneiras. Por exemplo, o sistema executa essas
tarefas imediatamente quando possível, e as restrições de gerenciamento de energia são menos propensas
a afetar as tarefas priorizadas.
Por esses motivos, tenha o cuidado de marcar uma tarefa somente como acelerada quando necessário. Como as tarefas priorizadas podem substituir algumas eficiências do sistema, as que aceleram podem consumir mais energia do que se não fossem marcadas dessa maneira.
Marque uma tarefa como acelerada somente se ela for urgente, e a experiência do usuário será prejudicada se a execução da tarefa demorar mais. Por exemplo, se o app executa uma tarefa para processar uma mensagem de alta prioridade do FCM, esse é um motivo apropriado para marcar a tarefa como acelerada. Mas não marque uma tarefa como acelerada apenas para substituir as otimizações do sistema.
Verificar por que suas tarefas foram interrompidas
Se as tarefas forem interrompidas antes de terminarem, você poderá verificar por que elas foram interrompidas
chamando WorkInfo.getStopReason()
. Para tarefas do JobScheduler, chame
JobParameters.getStopReason()
. É importante fazer isso por alguns
motivos. Primeiro, é claro, você quer que suas tarefas terminem. Descobrir por que
suas tarefas pararam ajuda você a evitar situações semelhantes. Além disso, é provável que o sistema
interrompa tarefas devido ao uso excessivo de recursos do sistema. Você
não quer que seu app seja um mau usuário, usando a bateria ou a rede
desnecessariamente.
Por exemplo, se as tarefas são interrompidas com frequência pelo motivo
STOP_REASON_TIMEOUT
, pode haver um caso extremo que, às vezes, faz com que
as tarefas demorem muito mais do que o esperado.
Recomendamos que você use o mecanismo de análise para rastrear se as tarefas do aplicativo foram interrompidas e por quais motivos.