Mantieni tutto organizzato con le raccolte
Salva e classifica i contenuti in base alle tue preferenze.
L'utilizzo di un wake lock può compromettere le prestazioni del dispositivo. Se devi utilizzare un wake
lock, è importante farlo correttamente. Questo documento illustra alcune best practice
che possono aiutarti a evitare le insidie comuni dei wake lock.
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 wake lock. Ecco alcuni suggerimenti aggiuntivi:
Non includere informazioni che consentono l'identificazione personale (PII) nel nome,
ad esempio un indirizzo email. Se il dispositivo rileva PII nel tag
wake lock, 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 ottenere il nome in modo programmatico, potrebbe essere offuscato da strumenti come Proguard. Utilizza invece una stringa
codificata.
Non aggiungere un contatore o identificatori unici ai tag wake lock. Il codice
che crea un wake lock deve utilizzare lo stesso tag ogni volta che viene eseguito.
Questa pratica consente al sistema di aggregare l'utilizzo del wake lock di ogni metodo.
Assicurati che la tua app sia visibile in primo piano
Mentre un wake lock è attivo, il dispositivo consuma energia. L'utente del dispositivo
deve essere consapevole di ciò che sta accadendo. Per questo motivo, se utilizzi un
wake lock, devi mostrare una notifica all'utente.
In pratica, ciò significa che devi ottenere e mantenere il wakelock in un
servizio in primo piano. I servizi in primo piano devono mostrare
una notifica.
Se un servizio in primo piano non è la scelta giusta per la tua app,
probabilmente non dovresti utilizzare nemmeno un wake lock. Consulta la
documentazione Scegliere l'API giusta per mantenere attivo il dispositivo
per altri modi per lavorare mentre l'app non è in primo piano.
Mantieni la logica semplice
Assicurati che la logica per l'acquisizione e il rilascio dei wake lock sia il più semplice
possibile. Quando la logica di blocco della riattivazione è legata a macchine a stati complessi, timeout, pool di esecutori o eventi di callback, qualsiasi bug sottile in questa logica può causare il blocco della riattivazione più a lungo del previsto. Questi bug sono difficili da diagnosticare
e correggere.
Verifica che il blocco di riattivazione venga sempre rilasciato
Se utilizzi un wake lock, devi assicurarti che ogni wake lock acquisito
venga rilasciato correttamente. Non è sempre facile come sembra. Ad esempio,
il seguente codice presenta un problema:
Kotlin
@Throws(MyException::class)fundoSomethingAndRelease(){wakeLock.apply{acquire()doTheWork()// can potentially throw MyExceptionrelease()// does not run if an exception is thrown}}
Java
voiddoSomethingAndRelease()throwsMyException{wakeLock.acquire();doTheWork();// can potentially throw MyExceptionwakeLock.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 wake lock viene acquisito ma non rilasciato, il che è molto grave.
Nel codice corretto, doSomethingAndRelease() si assicura di rilasciare il
wake lock anche se viene generata un'eccezione:
I campioni di contenuti e codice in questa pagina sono soggetti alle licenze descritte nella Licenza per i contenuti. Java e OpenJDK sono marchi o marchi registrati di Oracle e/o delle sue società consociate.
Ultimo aggiornamento 2025-08-27 UTC.
[[["Facile da capire","easyToUnderstand","thumb-up"],["Il problema è stato risolto","solvedMyProblem","thumb-up"],["Altra","otherUp","thumb-up"]],[["Mancano le informazioni di cui ho bisogno","missingTheInformationINeed","thumb-down"],["Troppo complicato/troppi passaggi","tooComplicatedTooManySteps","thumb-down"],["Obsoleti","outOfDate","thumb-down"],["Problema di traduzione","translationIssue","thumb-down"],["Problema relativo a esempi/codice","samplesCodeIssue","thumb-down"],["Altra","otherDown","thumb-down"]],["Ultimo aggiornamento 2025-08-27 UTC."],[],[],null,["Using a wake lock can impair device performance. If you need to use a wake\nlock, it's important to do it properly. This document covers some best practices\nthat can help you avoid common wake lock pitfalls.\n| **Note:** Creating and holding wake locks can have a dramatic impact on the device's battery life. You shouldn't use wake locks if there are any suitable alternatives. For other options, see the [Keep the device awake](/develop/background-work/background-tasks/awake) documentation. If you do need to use a wake lock, make sure to hold it for as short a time as possible.\n\nName the wake lock properly\n\nWe recommend including your package, class, or method name in the wakelock\ntag. That way, if an error occurs, it's easier to find the location in your\nsource code where the wake lock was created. Here are some additional tips:\n\n- Leave out any personally identifying information (PII) in the name, such as an email address. If the device detects PII in the wake lock tag, it logs `_UNKNOWN` instead of the tag you specified.\n- Don't get the class or method name programmatically, for example by calling `getName()`. If you try to get the name programmatically, it might get obfuscated by tools like Proguard. Instead use a hard-coded string.\n- Don't add a counter or unique identifiers to wake lock tags. The code that creates a wake lock should use the same tag every time it runs. This practice enables the system to aggregate each method's wake lock usage.\n\nMake sure your app is visible in the foreground\n\nWhile a wake lock is active, the device is using power. The device's user\nshould be aware that this is going on. For this reason, if you're using a\nwake lock, you should display some notification to the user.\nIn practice, this means you should get and hold the wakelock in a\n[foreground service](/develop/background-work/services/fgs). Foreground services are required to display\na notification.\n\nIf a foreground service isn't the right choice for your app,\nyou probably shouldn't be using a wake lock, either. See the\n[Choose the right API to keep the device awake](/develop/background-work/background-tasks/awake)\ndocumentation for other ways to do work while your app isn't in the foreground.\n\nKeep the logic simple\n\nMake sure the logic for acquiring and releasing wake locks is as simple as\npossible. When your wake lock logic is tied to complex state machines, timeouts,\nexecutor pools, or callback events, any subtle bug in that logic can cause the\nwake lock to be held longer than expected. These bugs are difficult to diagnose\nand debug.\n\nCheck that the wake lock is always released\n\nIf you use a wake lock, you must make sure that every wake lock you acquire\nis properly released. This isn't always as easy as it sounds. For example,\nthe following code has a problem: \n\nKotlin \n\n @Throws(MyException::class)\n fun doSomethingAndRelease() {\n wakeLock.apply {\n acquire()\n doTheWork() // can potentially throw MyException\n release() // does not run if an exception is thrown\n }\n }\n\nJava \n\n void doSomethingAndRelease() throws MyException {\n wakeLock.acquire();\n doTheWork(); // can potentially throw MyException\n wakeLock.release(); // does not run if an exception is thrown\n }\n\nThe problem here is that the method `doTheWork()` can throw the exception\n`MyException`. If it does, the `doSomethingAndRelease()` method propagates\nthe exception outward, and it never reaches the `release()` call. The result\nis that the wake lock is acquired but not released, which is very bad.\n\nIn the corrected code, `doSomethingAndRelease()` makes sure to release the\nwake lock even if an exception is thrown: \n\nKotlin \n\n @Throws(MyException::class)\n fun doSomethingAndRelease() {\n wakeLock.apply {\n try {\n acquire()\n doTheWork()\n } finally {\n release()\n }\n }\n }\n\nJava \n\n void doSomethingAndRelease() throws MyException {\n try {\n wakeLock.acquire();\n doTheWork();\n } finally {\n wakeLock.release();\n }\n }"]]