Otimizar o uso da bateria para APIs de agendamento de tarefas

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.