WakeLock: cos’è, tipi e gestione del blocco del sonno

Autore: IT Sectr Pubblicato: 2026-03-28 Tempo di lettura: 9 min

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 del sonno che mantiene il dispositivo attivo
  • Tipi — PARTIAL_WAKE_LOCK, FULL_WAKE_LOCK, SCREEN_DIM_WAKE_LOCK e altri
  • Permesso — WAKE_LOCK richiesto nel manifest ma non richiesto a runtime
  • Rischi — un WakeLock non rilasciato esaurisce la batteria e peggiora l’esperienza utente
  • Alternative — WorkManager, Foreground Service, JobScheduler riducono la necessità di WakeLock

Cos’è WakeLock

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.

Quando è necessario WakeLock

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.

Come funziona WakeLock

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.

WakeLock ed eventi di sistema

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.

Tipi di WakeLock in Android

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.

TipoCPUSchermoTastieraQuando usarlo
PARTIAL_WAKE_LOCKAccesoSpentoSpentoDownload file, calcoli
SCREEN_DIM_WAKE_LOCKAccesoScuroSpentoLettore video, presentazione
SCREEN_BRIGHT_WAKE_LOCKAccesoLuminosoSpentoGiochi (obsoleto)
FULL_WAKE_LOCKAccesoLuminosoLuminosoObsoleto (deprecated)

PARTIAL_WAKE_LOCK — tipo principale

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.

Tipi obsoleti (deprecated)

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 e consumo energetico

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.

  • Battery Historian — strumento per analizzare il consumo energetico e le perdite di WakeLock
  • Modalità Doze — limita WakeLock nelle finestre di manutenzione, unisce i blocchi
  • Google Play Console — mostra le statistiche WakeLock per le app pubblicate
  • Lista nera — l’app può essere contrassegnata dal sistema come energivora

Buone pratiche di utilizzo

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à.

Regola di rilascio

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.

Timeout di acquisizione

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%.

Verifica dello stato del blocco

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.

Utilizzo di WakeLock in Kotlin

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.

kotlin
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
}

Dichiarazione del permesso nel manifest

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.

xml
<uses-permission
    android:name="android.permission.WAKE_LOCK" />

<uses-permission
    android:name="android.permission.DEVICE_POWER" />

Alternative a WakeLock

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.

  • Foreground Service — gestione automatica di WakeLock con notifica
  • WorkManager — esecuzione garantita con supporto Doze e riavvio
  • JobScheduler — pianificazione con rete, carica e inattività
  • AlarmManager — risveglio del dispositivo per brevi attività pianificate

Domande frequenti

Cos’è WakeLock in Android

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.

Quali tipi di WakeLock esistono

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.

Serve un permesso per WakeLock

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.

Cosa succede se non rilascio un WakeLock

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.

Cosa può sostituire WakeLock nelle app moderne

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

  • WakeLock — un blocco del sonno che mantiene la CPU o lo schermo di un dispositivo Android attivi
  • PARTIAL_WAKE_LOCK — il tipo principale per le attività in background; schermo spento, CPU rimane attiva
  • Permesso — WAKE_LOCK nel manifest (permesso normale, nessun runtime richiesto)
  • Perdite — un WakeLock non rilasciato esaurisce la batteria del 30–50%; rilasciare in finally o tramite timeout
  • Obsoleto — SCREEN_DIM, SCREEN_BRIGHT e FULL_WAKE_LOCK sostituiti da FLAG_KEEP_SCREEN_ON
  • Foreground Service — alternativa con gestione automatica di WakeLock e notifica
  • WorkManager — la scelta migliore per attività in background differite con esecuzione garantita

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.

Discuti il progetto

Leggi anche