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
introduzido nas primeiras versões da Plataforma Android, mas, com o passar do tempo, muitos casos de
uso que exigiam o
AlarmManager
passaram a ser
melhor atendidos 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()
doAlarmManager
que incluem a flagRTC_WAKEUP
ouELAPSED_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.
- 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
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.