Ativações excessivas

As ativações são um mecanismo da API AlarmManager que permite que os desenvolvedores definam um alarme para ativar um dispositivo em um horário especificado. Para definir um alarme de ativação, o app chama um dos métodos set() no AlarmManager, com a flag 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, podem descarregar a bateria do dispositivo.

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

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

Corrigir o problema

O AlarmManager foi lançado nas primeiras versões da plataforma Android, mas, com o tempo, muitos casos de uso que antes precisavam de AlarmManager agora são melhor aproveitados por recursos mais recentes, como o WorkManager. Esta seção contém dicas para reduzir os alarmes de ativação. Contudo, a longo prazo, é recomendado migrar seu app para seguir as sugestõ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. Confira algumas dicas:

  • Procure chamadas para os vários métodos set() do AlarmManager que incluem a flag 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. Confira 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 vai 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 o nome 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 vai 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 comando ADB abaixo:

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 apenas se o app precisar executar uma operação voltada ao usuário, como postar uma notificação ou enviar um alerta. Para conferir uma lista de práticas recomendadas da AlarmManager, consulte Programar alarmes.

Não use o AlarmManager para programar tarefas em segundo plano, especialmente tarefas repetitivas ou de rede. Para programar tarefas em segundo plano, use o WorkManager, que oferece os benefícios abaixo:

  • 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 vão ser 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 o 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, que é mais fácil de usar e muito mais eficiente.