L'utilizzo di un blocco di attivazione può compromettere le prestazioni del dispositivo. Se devi utilizzare un blocco di riattivazione, è importante farlo correttamente. Questo documento illustra alcune best practice che possono aiutarti a evitare i problemi più comuni relativi al blocco sveglia.
Assegna un nome corretto al wakelock
Ti consigliamo di includere il nome del pacchetto, della classe o del metodo nel tag wakelock. In questo modo, se si verifica un errore, è più facile trovare la posizione nel codice sorgente in cui è stato creato il blocco di attivazione. Ecco alcuni suggerimenti aggiuntivi:
- Non includere nel nome informazioni che consentono l'identificazione personale (PII), come un indirizzo email. Se il dispositivo rileva PII nel tag di blocco sveglia, registra
_UNKNOWN
anziché il tag specificato. - Non recuperare il nome della classe o del metodo in modo programmatico, ad esempio chiamando
getName()
. Se provi a recuperare il nome in modo programmatico, potrebbe essere offuscato da strumenti come Proguard. Utilizza invece una stringa hardcoded. - Non aggiungere un contatore o identificatori univoci ai tag di blocco schermo. Il codice che crea un blocco di attivazione deve utilizzare lo stesso tag ogni volta che viene eseguito. Questa pratica consente al sistema di aggregare l'utilizzo della serratura di attivazione di ciascun metodo.
Assicurati che l'app sia visibile in primo piano
Quando un blocco di attivazione è attivo, il dispositivo consuma energia. L'utente del dispositivo deve essere consapevole di questa operazione. Per questo motivo, se utilizzi un blocco di attivazione, devi mostrare una notifica all'utente. In pratica, significa che devi ottenere e mantenere il blocco di riattivazione in un servizio in primo piano. I servizi in primo piano sono necessari per visualizzare una notifica.
Se un servizio in primo piano non è la scelta giusta per la tua app, probabilmente non dovresti utilizzare nemmeno un blocco riattivazione. Consulta la documentazione su come scegliere l'API giusta per mantenere attivo il dispositivo per scoprire altri modi per lavorare quando l'app non è in primo piano.
Mantieni la logica semplice
Assicurati che la logica per l'acquisizione e il rilascio delle chiavi di riattivazione sia il più semplice possibile. Quando la logica di blocco delle sveglie è legata a macchine a stati complesse, timeout, pool di executor o eventi di callback, qualsiasi bug sottile in questa logica può causare il blocco della veglia più a lungo del previsto. Questi bug sono difficili da diagnosticare e da eseguire il debug.
Verifica che il blocco di attivazione sia sempre rilasciato
Se utilizzi un blocco di attivazione, devi assicurarti che ogni blocco di attivazione acquisito sia rilasciato correttamente. Non è sempre facile come sembra. Ad esempio, nel seguente codice è presente un problema:
Kotlin
@Throws(MyException::class)
fun doSomethingAndRelease() {
wakeLock.apply {
acquire()
doTheWork() // can potentially throw MyException
release() // does not run if an exception is thrown
}
}
Java
void doSomethingAndRelease() throws MyException {
wakeLock.acquire();
doTheWork(); // can potentially throw MyException
wakeLock.release(); // does not run if an exception is thrown
}
Il problema è che il metodo doTheWork()
può generare l'eccezione
MyException
. In questo caso, il metodo doSomethingAndRelease()
propaga
l'eccezione verso l'esterno e non raggiunge mai la chiamata release()
. Il risultato è che il blocco di attivazione viene acquisito, ma non rilasciato, il che è molto grave.
Nel codice corretto, doSomethingAndRelease()
si assicura di rilasciare il blocco di attivazione anche se viene lanciata un'eccezione:
Kotlin
@Throws(MyException::class)
fun doSomethingAndRelease() {
wakeLock.apply {
try {
acquire()
doTheWork()
} finally {
release()
}
}
}
Java
void doSomethingAndRelease() throws MyException {
try {
wakeLock.acquire();
doTheWork();
} finally {
wakeLock.release();
}
}