WakeLock è un meccanismo di Android che impedisce al dispositivo di entrare in modalità sospensione mantenendo la CPU o lo schermo attivi. Le attività in background, come il download di file, la riproduzione audio o la registrazione di dati, richiedono WakeLock per un’esecuzione garantita senza interruzioni. Secondo le specifiche di Android Developers, 2025, un uso improprio di WakeLock porta a un rapido esaurimento della batteria e può causare il blocco dell’app su Google Play.
Punti chiave
WakeLock è un blocco di sistema che impedisce ad Android di mettere il dispositivo in modalità a basso consumo. Normalmente, dopo alcuni secondi di inattività dell’utente, Android spegne lo schermo e mette la CPU in stato di sonno profondo (deep sleep), sospendendo i thread in background. WakeLock impedisce questa transizione mantenendo la CPU attiva.
Il meccanismo WakeLock viene gestito attraverso il servizio di sistema PowerManager, accessibile tramite il metodo getSystemService(Context.POWER_SERVICE). Lo sviluppatore crea un oggetto WakeLock, specificando il tipo di blocco, e deve rilasciarlo garantitamente dopo il completamento dell’attività, altrimenti la batteria del dispositivo si esaurirà rapidamente. Il sistema non rilascia WakeLock automaticamente — è responsabilità dell’app.
Con ogni release principale di Android, Google inasprisce il controllo su WakeLock. A partire da Android 9 (API 28), un’app in background non può acquisire WakeLock senza un valido motivo, e il sistema monitora le app che abusano dei blocchi e può rilasciarli forzatamente. In Android 12+ sono state introdotte ulteriori restrizioni all’accesso a PowerManager per le app in background.
WakeLock è necessario negli scenari in cui un’attività non può essere interrotta dalla sospensione del dispositivo: download di un file grande su una connessione instabile, registrazione video, esecuzione di calcoli lunghi senza interazione dell’utente. Senza un blocco del sonno, la CPU entra in sonno profondo, tutti i thread si bloccano e l’attività rimane incompleta.
Tuttavia, Google raccomanda vivamente di ridurre al minimo l’uso di WakeLock. Nella maggior parte dei casi, la stessa attività può essere risolta con Foreground Service con notifica, WorkManager o JobScheduler. Questi meccanismi tengono conto dello stato della batteria e della rete, prolungando la durata della batteria del dispositivo.
WakeLock funziona attraverso il servizio di sistema PowerManager, che gestisce lo stato di alimentazione del dispositivo. Quando un’app richiede un blocco tramite powerManager.newWakeLock(), il sistema aumenta il livello di attività della CPU, impedendo il sonno profondo. Dopo aver chiamato wakeLock.release(), il sistema torna alla normale modalità di risparmio energetico.
È importante capire che WakeLock non impedisce tutte le modalità di risparmio energetico. La Modalità Doze (modalità sospensione da Android 6+) può ignorare WakeLock in determinate fasi — un’app che mantiene un WakeLock non avrà accesso alla rete durante le finestre di manutenzione di Doze. Ciò significa che anche un WakeLock attivo non garantisce operazioni di rete durante la seconda fase di Doze.
Ogni WakeLock è associato a un PowerManager.WakeLock sul lato framework. Il sistema conta i blocchi attivi a livello di processo: se un processo mantiene più WakeLock, si accumulano e il rilascio avviene solo dopo aver chiamato release() per ciascun blocco. Android supporta anche timeout dei wake lock — rilascio automatico dopo un intervallo specificato. Tuttavia, non è consigliabile fare affidamento sul timeout: l’attività potrebbe terminare prima e il tempo di mantenimento extra ridurrà la durata della batteria.
Quando il dispositivo entra in modalità sospensione (pulsante di accensione), Android rilascia forzatamente tutti i SCREEN_DIM_WAKE_LOCK e SCREEN_BRIGHT_WAKE_LOCK ma mantiene PARTIAL_WAKE_LOCK. Ciò significa che un blocco dello schermo non può mantenere il display acceso — solo PARTIAL_WAKE_LOCK può continuare a funzionare dopo aver premuto il pulsante di accensione.
Android ha diversi tipi di WakeLock, ognuno dei quali controlla componenti specifici del dispositivo. La scelta del tipo determina quali componenti hardware rimangono attivi dopo il blocco. Scegliere il tipo sbagliato porta a un consumo eccessivo di energia a causa del mantenimento di moduli non necessari accesi.
| Tipo | CPU | Schermo | Tastiera | Quando usarlo |
|---|---|---|---|---|
| PARTIAL_WAKE_LOCK | Acceso | Spento | Spento | Download file, calcoli |
| SCREEN_DIM_WAKE_LOCK | Acceso | Scuro | Spento | Lettore video, presentazione |
| SCREEN_BRIGHT_WAKE_LOCK | Acceso | Luminoso | Spento | Giochi (obsoleto) |
| FULL_WAKE_LOCK | Acceso | Luminoso | Luminoso | Obsoleto (deprecated) |
PARTIAL_WAKE_LOCK è il tipo più utilizzato e raccomandato. Mantiene la CPU attiva ma consente allo schermo e alla retroilluminazione della tastiera di spegnersi. Questa è la scelta ottimale per le attività in background: caricamento dati, elaborazione immagini, sincronizzazione. Lo schermo si spegne dopo il timeout di sistema, risparmiando batteria mentre si esegue un lavoro invisibile all’utente.
SCREEN_DIM_WAKE_LOCK, SCREEN_BRIGHT_WAKE_LOCK e FULL_WAKE_LOCK sono obsoleti da Android 7 (API 24). Mantengono lo schermo acceso, causando un consumo significativo della batteria. Google raccomanda di usare FLAG_KEEP_SCREEN_ON tramite Activity.getWindow().addFlags() invece — questo flag funziona solo quando l’Activity è attiva e non richiede il permesso WAKE_LOCK, mentre il sistema gestisce automaticamente il tempo di mantenimento dello schermo.
WakeLock è uno dei principali consumatori di batteria su Android. Ogni secondo di mantenimento di un blocco del sonno consuma energia extra perché la CPU non può passare a uno stato C a basso consumo. La ricerca di Google Power Dashboard mostra che le app con WakeLock rilasciati in modo improprio possono aumentare il consumo energetico del dispositivo del 30–50% in modalità standby.
Il sistema traccia le app che abusano di WakeLock attraverso il componente Battery Historian. Lo sviluppatore può analizzare il profilo di consumo energetico e identificare perdite di blocchi — situazioni in cui un WakeLock è stato creato ma non rilasciato. Google Play Console mostra le statistiche WakeLock per le app pubblicate e un tempo di mantenimento elevato può portare a recensioni negative.
La Modalità Doze e App Standby limitano ulteriormente il funzionamento di WakeLock. Nella prima fase di Doze (Light Doze), il sistema consente WakeLock in brevi finestre di manutenzione. Nella seconda fase (Deep Doze), WakeLock viene unito ad altri blocchi ed eseguito in una finestra comune. Se un’app mantiene un WakeLock per più di 10 minuti senza interazione dell’utente, il sistema può rilasciarlo forzatamente e aggiungere l’app alla lista nera di ottimizzazione della batteria.
L’uso corretto di WakeLock è un equilibrio tra la necessità di completare un’attività e la cura della batteria del dispositivo. Google raccomanda di seguire diversi principi: rilasciare sempre WakeLock in un blocco finally o tramite acquire(timeout), usare il tipo di blocco minimo necessario ed evitare mantenimenti prolungati senza estrema necessità.
WakeLock dovrebbe essere rilasciato nello stesso blocco di codice in cui è stato creato. Per garantire il rilascio in caso di eccezioni, si usa la costruzione try-finally o il blocco use di Kotlin. Su Android 10+, il sistema mostra un avviso in logcat se un WakeLock viene mantenuto per più di 60 secondi: "WakeLock held for more than 60 seconds" — questo segnala una possibile perdita.
Il metodo acquire(long timeout) rilascia automaticamente WakeLock dopo il tempo specificato in millisecondi. Questa è una salvaguardia nel caso in cui il codice di rilascio non venga eseguito a causa di un’eccezione o un bug. Si raccomanda di specificare sempre un timeout pari al tempo massimo previsto di esecuzione dell’attività più un margine del 10–20%.
Prima di chiamare release(), bisogna verificare se WakeLock è attualmente mantenuto. Chiamare nuovamente release() senza un precedente acquire() provoca un RuntimeException: WakeLock under-locked. Si raccomanda di memorizzare un flag di stato (isHeld) e verificare wakeLock.isHeld() prima di rilasciare.
Esaminiamo la creazione e il rilascio corretti di WakeLock in Kotlin. L’esempio dimostra il caricamento asincrono dei dati con mantenimento di PARTIAL_WAKE_LOCK, rilascio garantito in un blocco try-finally e un timeout specificato come salvaguardia contro le perdite. Il servizio utilizza CoroutineScope con il dispatcher IO per l’esecuzione di attività in background.
class DownloadService : Service() {
private lateinit var wakeLock: PowerManager.WakeLock
private val scope = CoroutineScope(Dispatchers.IO + SupervisorJob())
override fun onCreate() {
super.onCreate()
val powerManager = getSystemService(Context.POWER_SERVICE) as PowerManager
wakeLock = powerManager.newWakeLock(
PowerManager.PARTIAL_WAKE_LOCK,
"download:wakelock"
)
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
wakeLock.acquire(60000)
scope.launch {
try {
downloadFile()
} finally {
if (wakeLock.isHeld()) {
wakeLock.release()
}
}
}
return START_NOT_STICKY
}
private suspend fun downloadFile() {
// Simulazione download file
delay(30000)
}
override fun onDestroy() {
super.onDestroy()
scope.cancel()
if (wakeLock.isHeld()) {
wakeLock.release()
}
}
override fun onBind(intent: Intent): IBinder? = null
}
Per utilizzare WakeLock, è necessario aggiungere il permesso in AndroidManifest.xml. Il permesso WAKE_LOCK è un permesso normale — non richiede richiesta a runtime all’utente e viene concesso automaticamente all’installazione dell’app. Tuttavia, Google Play può rifiutare la pubblicazione se l’app non ha un caso d’uso ovvio per WakeLock.
<uses-permission
android:name="android.permission.WAKE_LOCK" />
<uses-permission
android:name="android.permission.DEVICE_POWER" />
WakeLock è un meccanismo di basso livello e Google raccomanda di sostituirlo con API più moderne quando possibile. L’alternativa principale è Foreground Service con una notifica, che mantiene automaticamente il blocco della CPU per la durata del servizio. Il sistema gestisce esso stesso WakeLock per Foreground Service, liberando lo sviluppatore dall’acquisizione e dal rilascio espliciti.
WorkManager è il secondo strumento più importante per le attività in background. Garantisce l’esecuzione dell’attività anche quando il dispositivo entra in modalità Doze e dopo il riavvio. WorkManager supporta un blocco interno (hold lock) — lo sviluppatore non deve lavorare esplicitamente con PowerManager. L’attività viene eseguita nella finestra di manutenzione di Doze con gestione automatica del blocco del sonno.
Per attività ricorrenti che richiedono tempistica precisa, si usa AlarmManager con setAndAllowWhileIdle(), che può risvegliare il dispositivo da Doze. Tuttavia, AlarmManager è adatto solo per operazioni brevi — non è progettato per il mantenimento prolungato di WakeLock. Se un’attività richiede più di 10 secondi, combina AlarmManager con un BroadcastReceiver che avvia un Foreground Service.
Domande frequenti
WakeLock è un blocco di sistema che impedisce a un dispositivo Android di entrare in modalità sospensione. Mantiene la CPU o lo schermo attivi, consentendo alle attività in background (download, calcoli) di essere eseguite senza interruzioni. Viene gestito attraverso il servizio di sistema PowerManager.
I tipi principali sono: PARTIAL_WAKE_LOCK (CPU attiva, schermo spento) — raccomandato; SCREEN_DIM_WAKE_LOCK (CPU + schermo scuro); SCREEN_BRIGHT_WAKE_LOCK (CPU + schermo luminoso). SCREEN_DIM, SCREEN_BRIGHT e FULL_WAKE_LOCK sono obsoleti e sostituiti da FLAG_KEEP_SCREEN_ON.
Sì, è necessario dichiarare android.permission.WAKE_LOCK nel manifest. Questo è un permesso normale che viene concesso automaticamente all’installazione — non è necessario richiederlo a runtime. Senza questo permesso, la chiamata newWakeLock() restituirà null o lancerà una SecurityException.
Se release() non viene chiamato, il dispositivo non può entrare in modalità sospensione. La batteria si esaurirà molto più velocemente (fino al 50% di consumo extra). Il sistema registrerà la perdita in logcat e Battery Historian mostrerà un tempo di mantenimento anomalo di WakeLock, portando a recensioni negative degli utenti.
Per attività lunghe, usa Foreground Service con una notifica — il sistema gestisce WakeLock da solo. Per attività differite e garantite, usa WorkManager, che supporta WakeLock internamente. Per brevi attività pianificate, usa AlarmManager.
Riepilogo
Svilupperemo un'applicazione mobile chiavi in mano
IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.
Leggi anche