I wake-up sono un meccanismo dell'API
AlarmManager che
consente agli sviluppatori di impostare una sveglia per riattivare un dispositivo a un'ora specificata. La tua app
imposta una sveglia chiamando uno dei metodi set() in
AlarmManager con
il flag
RTC_WAKEUP
o
ELAPSED_REALTIME_WAKEUP. Quando viene attivata una sveglia, il dispositivo esce dalla modalità a basso consumo energetico
e mantiene un wakelock parziale durante l'esecuzione del metodo
onReceive()
o
onAlarm()
della sveglia. Se gli allarmi di sveglia vengono attivati eccessivamente, possono scaricare la batteria di un dispositivo.
Se la tua app riattiva eccessivamente il dispositivo, puoi utilizzare le indicazioni riportate in questa pagina per diagnosticare e risolvere il problema.
Risolvi il problema
AlarmManager è stato introdotto nelle prime versioni della piattaforma Android, ma nel tempo molti casi d'uso che in precedenza richiedevano AlarmManager ora sono gestiti meglio da funzionalità più recenti come WorkManager.
Questa sezione contiene suggerimenti per ridurre gli allarmi di riattivazione, ma a lungo termine
valuta la migrazione dell'app in modo che segua i consigli della sezione best
practice.
Identifica i punti della tua app in cui pianifichi le sveglie e riduci la frequenza con cui vengono attivate. Ecco alcuni suggerimenti:
Cerca chiamate ai vari metodi
set()inAlarmManagerche includono il flagRTC_WAKEUPoELAPSED_REALTIME_WAKEUP.Ti consigliamo di includere il nome del pacchetto, della classe o del metodo nel nome del tag dell'allarme in modo da poter identificare facilmente la posizione nell'origine in cui è stato impostato l'allarme. Ecco alcuni suggerimenti aggiuntivi:
- Non includere informazioni che consentono l'identificazione personale (PII) nel nome, ad esempio
un indirizzo email. In caso contrario, il dispositivo registra
_UNKNOWNanziché il nome della sveglia. - Non ottenere il nome della classe o del metodo in modo programmatico, ad esempio chiamando
getName(), perché potrebbe essere offuscato da Proguard. Utilizza invece una stringa hardcoded. - Non aggiungere un contatore o identificatori unici ai tag di allarme. Il sistema non sarà in grado di aggregare gli allarmi impostati in questo modo perché hanno tutti identificatori unici.
- Non includere informazioni che consentono l'identificazione personale (PII) nel nome, ad esempio
un indirizzo email. In caso contrario, il dispositivo registra
Dopo aver risolto il problema, verifica che le sveglie funzionino come previsto eseguendo questo comando ADB:
adb shell dumpsys alarm
Questo comando fornisce informazioni sullo stato del servizio di sistema di allarme sul dispositivo. Per saperne di più, consulta dumpsys.
Best practice
Utilizza le sveglie di riattivazione solo se la tua app deve eseguire un'operazione rivolta all'utente (ad esempio pubblicare una notifica o avvisare l'utente). Per un elenco delle best practice di AlarmManager, consulta Pianificazione di sveglie.
Non utilizzare
AlarmManager per
pianificare attività in background, in particolare attività in background ripetute o di rete. Utilizza
WorkManager
per pianificare le attività in background perché offre i seguenti vantaggi:
- raggruppamento: i job vengono combinati in modo da ridurre il consumo di batteria
- persistenza: se il dispositivo viene riavviato, i job WorkManager pianificati vengono eseguiti al termine del riavvio
- criteri: i job possono essere eseguiti in base a condizioni, ad esempio se il dispositivo è in carica o se è disponibile il Wi-Fi
Per saperne di più, consulta la Guida all'elaborazione in background.
Non utilizzare AlarmManager
per pianificare operazioni di temporizzazione valide solo mentre l'app è in esecuzione (in
altre parole, l'operazione di temporizzazione deve essere annullata quando l'utente esce dall'app). In queste situazioni, utilizza la classe
Handler perché è
più facile da usare e molto più efficiente.
Consigliati per te
- Nota: il testo del link viene visualizzato quando JavaScript è disattivato
- Wakelock parziali bloccati
- ANR