Ativações excessivas

As ativações são um mecanismo da API AlarmManager que permite aos desenvolvedores definir um alarme para ativar um dispositivo em um horário especificado. Seu app define um alarme de ativação chamando um dos métodos set() na AlarmManager com a sinalização RTC_WAKEUP ou ELAPSED_REALTIME_WAKEUP. Quando um alarme de ativação é acionado, o dispositivo sai do modo de baixa energia e mantém um wake lock parcial enquanto executa o método onReceive() ou onAlarm() do alarme. Se os alarmes de ativação forem acionados em excesso, poderão descarregar a bateria de um dispositivo.

Para ajudar a melhorar a qualidade do app, o Android monitora automaticamente os apps em busca de alarmes com ativação excessiva e exibe as informações no "Android vitals". Para informações sobre como os dados são coletados, consulte os documentos do Play Console.

Se seu app está ativando o dispositivo excessivamente, use as orientações desta página para diagnosticar e corrigir o problema.

Corrigir o problema

A AlarmManager foi introduzida nas primeiras versões da plataforma Android, mas, com o passar do tempo, muitos casos de uso que anteriormente exigiam a AlarmManager agora são mais bem atendidos por recursos mais recentes, como o WorkManager. Esta seção contém dicas para reduzir os alarmes de ativação, mas, a longo prazo, considere a possibilidade de migrar seu app para seguir as recomendações da seção de práticas recomendadas.

Identifique os locais no app em que você pode programar alarmes de ativação e reduzir a frequência com que esses alarmes são acionados. Veja algumas dicas:

  • Procure chamadas para os diversos métodos set() no AlarmManager com a sinalização RTC_WAKEUP ou ELAPSED_REALTIME_WAKEUP.

  • Recomendamos que você inclua o nome do pacote, da classe ou do método no nome da tag do alarme para identificar facilmente o local no código-fonte em que o alarme foi definido. Veja mais algumas dicas:

    • Não inclua informações de identificação pessoal (PII, na sigla em inglês) no nome, como um endereço de e-mail. Caso contrário, o dispositivo registrará _UNKNOWN, em vez do nome do alarme.
    • Não busque o nome da classe ou do método de forma programática, por exemplo, chamando getName(), porque ele pode ser ofuscado pelo Proguard. Em vez disso, use uma string codificada.
    • Não adicione um contador ou identificadores exclusivos às tags de alarme. O sistema não poderá agregar alarmes definidos dessa forma porque todos têm identificadores exclusivos.

Depois de corrigir o problema, verifique se os alarmes de ativação estão funcionando conforme o esperado executando o seguinte comando ADB:

adb shell dumpsys alarm
    

Esse comando fornece informações sobre o status do serviço do sistema de alarme no dispositivo. Para mais informações, consulte dumpsys.

Práticas recomendadas

Use os alarmes de ativação somente se o app precisar executar uma operação voltada para o usuário, como postar uma notificação ou enviar um alerta para ele. Para ver uma lista de práticas recomendadas da AlarmManager, consulte Programar alarmes com repetição.

Não use o AlarmManager para programar tarefas em segundo plano, especialmente tarefas repetitivas ou de rede em segundo plano. Use o WorkManager para programar tarefas em segundo plano, porque ele oferece os seguintes benefícios:

  • Lotes: as tarefas são combinadas para que o consumo da bateria seja reduzido.
  • Persistência: se o dispositivo for reinicializado, as tarefas programadas do WorkManager serão executadas após a reinicialização.
  • Critérios: tarefas podem ser executadas com base nas condições, por exemplo, se o dispositivo está carregando ou se o Wi-Fi está disponível.

Para mais informações, consulte o Guia para o processamento em segundo plano.

Não use a AlarmManager para programar operações de tempo válidas apenas enquanto o app estiver em execução. Em outras palavras, a operação de tempo precisa ser cancelada quando o usuário sai do app. Nessas situações, use a classe Handler porque ela é mais fácil de usar e muito mais eficiente.