WakeLock: wat is het, typen en beheer van slaapblokkade

Auteur: IT Sectr Gepubliceerd: 2026-03-28 Leestijd: 9 min

WakeLock is een Android-mechanisme dat voorkomt dat het apparaat in slaapmodus gaat, door de processor of het scherm actief te houden. Achtergrondtaken zoals het downloaden van bestanden, het afspelen van audio of het vastleggen van gegevens hebben WakeLock nodig om gegarandeerd zonder onderbrekingen te worden uitgevoerd. Volgens de specificatie van Android Developers, 2025, leidt onjuist gebruik van WakeLock tot snelle batterijontlading en kan de app worden geblokkeerd in Google Play.

Belangrijkste punten

  • WakeLock — slaapblokkade, die het apparaat actief houdt
  • Typen — PARTIAL_WAKE_LOCK, FULL_WAKE_LOCK, SCREEN_DIM_WAKE_LOCK en andere
  • Toestemming — WAKE_LOCK vereist in manifest, maar niet in runtime
  • Risico's — niet- vrijgegeven WakeLock ontlaadt de batterij en verslechtert de gebruikerservaring
  • Alternatieven — WorkManager, Foreground Service, JobScheduler verminderen de behoefte aan WakeLock

Wat is WakeLock

WakeLock is een systeemblokkade die verhindert dat Android het apparaat in de energiebesparende modus zet. Normaal gesproken schakelt Android na enkele seconden inactiviteit van de gebruiker het scherm uit en brengt de processor in diepe slaap (deep sleep), waarbij achtergrondthreads worden gepauzeerd. WakeLock voorkomt deze overgang door de CPU actief te houden.

Het WakeLock-mechanisme wordt beheerd via de systeemservice PowerManager, die toegankelijk is via de methode getSystemService(Context.POWER_SERVICE). De ontwikkelaar maakt een WakeLock-object aan met een specifiek blokkadetype en moet het gegarandeerd vrijgeven na voltooiing van de taak, anders raakt de batterij van het apparaat snel leeg. Het systeem geeft WakeLock niet automatisch vrij — dit is de verantwoordelijkheid van de app.

Met elke grote Android-versie verscherpt Google de controle over WakeLock. Vanaf Android 9 (API 28) kan een app op de achtergrond geen WakeLock verkrijgen zonder geldige reden, en het systeem houdt apps in de gaten die blokkades misbruiken en kan ze geforceerd vrijgeven. In Android 12+ zijn extra beperkingen ingevoerd voor toegang tot PowerManager voor achtergrond-apps.

Wanneer is WakeLock nodig

WakeLock is nodig in scenario's waarin een taak niet kan worden onderbroken door het apparaat in slaap te laten gaan: het downloaden van een groot bestand via een onstabiele verbinding, het opnemen van video, het uitvoeren van lange berekeningen zonder gebruikersinteractie. Zonder slaapblokkade gaat de processor in diepe slaap, worden alle threads bevroren en blijft de taak onvoltooid.

Google raadt echter ten zeerste aan het gebruik van WakeLock te minimaliseren. In de meeste gevallen kan dezelfde taak worden opgelost met Foreground Service met melding, WorkManager of JobScheduler. Deze mechanismen houden rekening met de batterij- en netwerkstatus, wat de batterijduur van het apparaat verlengt.

Hoe werkt WakeLock

WakeLock werkt via de systeemservice PowerManager die de voedingstoestand van het apparaat beheert. Wanneer een app een blokkade aanvraagt via powerManager.newWakeLock(), verhoogt het systeem het activiteitsniveau van de CPU, waardoor overgang naar diepe slaap wordt voorkomen. Na aanroep van wakeLock.release() keert het systeem terug naar de normale energiebesparende modus.

Het is belangrijk te begrijpen dat WakeLock niet alle energiebesparende modi voorkomt. Doze Mode (slaapmodus Android 6+) kan WakeLock in bepaalde fasen negeren — een app met een vastgehouden WakeLock krijgt geen toegang tot het netwerk in de Doze-onderhoudsvensters. Dit betekent dat zelfs een actieve WakeLock geen garantie biedt voor netwerkoperaties tijdens de tweede fase van Doze.

Elke WakeLock is gekoppeld aan PowerManager.WakeLock aan de framework-kant. Het systeem houdt een telling bij van actieve blokkades op processniveau: als één proces meerdere WakeLocks vasthoudt, worden ze opgeteld en vindt vrijgave pas plaats na aanroep van release() voor elke blokkade. Android ondersteunt ook wake lock timeouts — automatische vrijgave na een ingesteld interval. Vertrouwen op timeout wordt echter afgeraden: de taak kan eerder eindigen en de extra vasthoudtijd verkort de batterijduur.

WakeLock en systeemgebeurtenissen

Bij overgang van het apparaat naar slaapmodus (aan/uit-knop) geeft Android geforceerd alle SCREEN_DIM_WAKE_LOCK en SCREEN_BRIGHT_WAKE_LOCK vrij, maar behoudt PARTIAL_WAKE_LOCK. Dit betekent dat een schermblokkade het apparaat niet kan weerhouden het display uit te schakelen — alleen PARTIAL_WAKE_LOCK kan blijven werken na het indrukken van de aan/uit-knop.

WakeLock-typen in Android

In Android bestaan verschillende WakeLock-typen, die elk specifieke hardwarecomponenten van het apparaat beheren. De keuze van het type bepaalt welke hardwarecomponenten actief blijven na de blokkade. Een verkeerde typekeuze leidt tot overmatig energieverbruik door het inschakelen van onnodige modules.

TypeCPUSchermToetsenbordWanneer gebruiken
PARTIAL_WAKE_LOCKAanUitUitBestanden downloaden, berekeningen
SCREEN_DIM_WAKE_LOCKAanGedimdUitVideospeler, presentatie
SCREEN_BRIGHT_WAKE_LOCKAanHelderUitGames (verouderd)
FULL_WAKE_LOCKAanHelderHelderVerouderd (deprecated)

PARTIAL_WAKE_LOCK — het belangrijkste type

PARTIAL_WAKE_LOCK is het meest gebruikte en aanbevolen type. Het houdt de CPU actief, maar laat het scherm en de toetsenbordverlichting uitschakelen. Dit is de optimale keuze voor achtergrondtaken: gegevens downloaden, afbeeldingen verwerken, synchroniseren. Het scherm gaat uit na de systeemtimeout, wat batterij bespaart tijdens het uitvoeren van voor de gebruiker onzichtbaar werk.

Verouderde typen (deprecated)

SCREEN_DIM_WAKE_LOCK, SCREEN_BRIGHT_WAKE_LOCK en FULL_WAKE_LOCK zijn gemarkeerd als verouderd vanaf Android 7 (API 24). Ze houden het scherm ingeschakeld, wat leidt tot aanzienlijk batterijverbruik. Google raadt aan in plaats daarvan FLAG_KEEP_SCREEN_ON te gebruiken via Activity.getWindow().addFlags() — deze vlag werkt alleen met een actieve Activity en vereist geen WAKE_LOCK-toestemming, en het systeem beheert automatisch de schermvasthoudtijd.

WakeLock en energieverbruik

WakeLock is een van de grootste batterijverbruikers op Android. Elke seconde dat de slaapblokkade wordt vastgehouden, verbruikt extra energie omdat de processor niet kan overgaan naar de energie-efficiënte C-state. Google Power Dashboard-onderzoek toont aan dat apps met onjuist vrijgegeven WakeLocks het energieverbruik van het apparaat met 30–50% kunnen verhogen in de stand-bymodus.

Het systeem houdt apps die WakeLock misbruiken in de gaten via de component Battery Historian. De ontwikkelaar kan het energieverbruiksprofiel analyseren en blokkadelekkages detecteren — situaties waarin WakeLock is aangemaakt maar niet is vrijgegeven. Google Play Console toont WakeLock-statistieken voor gepubliceerde apps, en een lange vasthoudtijd kan leiden tot negatieve beoordelingen.

Doze Mode en App Standby beperken de werking van WakeLock verder. In de eerste fase van Doze (Light Doze) staat het systeem WakeLock toe in korte onderhoudsvensters. In de tweede fase (Deep Doze) wordt WakeLock gecombineerd met andere blokkades en uitgevoerd in een gemeenschappelijk venster. Als een app WakeLock langer dan 10 minuten vasthoudt zonder gebruikersinteractie, kan het systeem deze geforceerd vrijgeven en de app op de zwarte lijst van batterijoptimalisatie plaatsen.

  • Battery Historian — hulpmiddel voor analyse van energieverbruik en WakeLock-lekkages
  • Doze Mode — beperkt WakeLock in onderhoudsvensters door blokkades te combineren
  • Google Play Console — toont WakeLock-statistieken voor gepubliceerde apps
  • Zwarte lijst — de app kan door het systeem als energie-intensief worden gemarkeerd

Beste praktijken voor gebruik

Correct gebruik van WakeLock is een balans tussen de noodzaak om een taak uit te voeren en zorg voor de batterij van het apparaat. Google raadt aan een aantal principes te volgen: geef WakeLock altijd vrij in finally of via acquire(timeout), gebruik het minimaal benodigde blokkadetype en vermijd langdurig vasthouden zonder noodzaak.

Vrijgave-regel

WakeLock moet worden vrijgegeven in hetzelfde codeblok waarin het is gemaakt. Voor gegarandeerde vrijgave bij uitzonderingen wordt de try-finally-constructie of het use-blok in Kotlin gebruikt. Op Android 10+ geeft het systeem een waarschuwing in logcat als WakeLock langer dan 60 seconden wordt vastgehouden: "WakeLock held for more than 60 seconds" — dit is een signaal van mogelijke lekkage.

Timeout bij acquisitie

De methode acquire(long timeout) geeft WakeLock automatisch vrij na de opgegeven tijd in milliseconden. Dit is een vangnet voor het geval de vrijgavecode niet wordt uitgevoerd vanwege een uitzondering of bug. Het wordt aanbevolen altijd een timeout in te stellen die gelijk is aan de maximaal verwachte uitvoeringstijd van de taak plus 10–20% reserve.

Controleren of blokkade actief is

Voor het aanroepen van release() moet worden gecontroleerd of WakeLock momenteel wordt vastgehouden. Herhaalde aanroep van release() zonder voorafgaand acquire() veroorzaakt RuntimeException: WakeLock under-locked. Het wordt aanbevolen een statusvlag (isHeld) bij te houden en voor vrijgave wakeLock.isHeld() te controleren.

WakeLock gebruiken in Kotlin

Laten we het correct aanmaken en vrijgeven van WakeLock in Kotlin bekijken. Het voorbeeld toont het asynchroon downloaden van gegevens met het vasthouden van PARTIAL_WAKE_LOCK, gegarandeerde vrijgave in het try-finally-blok en het instellen van een timeout als bescherming tegen lekkages. De service gebruikt CoroutineScope met een IO-dispatcher voor het uitvoeren van de achtergrondtaak.

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() {
        // Simulatie van bestandsdownload
        delay(30000)
    }

    override fun onDestroy() {
        super.onDestroy()
        scope.cancel()
        if (wakeLock.isHeld()) {
            wakeLock.release()
        }
    }

    override fun onBind(intent: Intent): IBinder? = null
}

Toestemming declareren in het manifest

Voor het gebruik van WakeLock moet u toestemming toevoegen in AndroidManifest.xml. De WAKE_LOCK-toestemming is normaal (normal) — vereist geen runtime-aanvraag van de gebruiker en wordt automatisch verleend bij installatie van de app. Google Play kan publicatie echter weigeren als de app geen duidelijk scenario voor WakeLock-gebruik heeft.

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

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

Alternatieven voor WakeLock

WakeLock is een laag niveau mechanisme en Google raadt aan het waar mogelijk te vervangen door modernere API's. Het belangrijkste alternatief is Foreground Service met melding, die automatisch de CPU-blokkade vasthoudt tijdens de werking van de service. Het systeem beheert zelf WakeLock voor Foreground Service, waardoor de ontwikkelaar niet expliciet hoeft vast te leggen en vrij te geven.

WorkManager is het op een na belangrijkste hulpmiddel voor achtergrondtaken. Het garandeert uitvoering van werk, zelfs wanneer het apparaat in Doze gaat en na herstart. WorkManager ondersteunt intern blokkade vasthouden (hold lock) — de ontwikkelaar hoeft niet expliciet met PowerManager te werken. De taak wordt uitgevoerd in het Doze-onderhoudsvenster met automatisch beheer van de slaapblokkade.

Voor regelmatige taken die exacte timing vereisen, wordt AlarmManager met setAndAllowWhileIdle() gebruikt, die het apparaat uit Doze kan wekken. AlarmManager is echter alleen geschikt voor korte operaties — het is niet bedoeld voor langdurig vasthouden van WakeLock. Als een taak langer dan 10 seconden duurt, moet AlarmManager worden gecombineerd met een BroadcastReceiver die Foreground Service start.

  • Foreground Service — automatisch WakeLock-beheer met melding
  • WorkManager — gegarandeerde uitvoering rekening houdend met Doze en herstart
  • JobScheduler — planning rekening houdend met netwerk, opladen en inactiviteit
  • AlarmManager — apparaat wekken voor korte taken op schema

Veelgestelde vragen

Wat is WakeLock in Android?

WakeLock is een systeemblokkade die voorkomt dat een Android-apparaat in slaapmodus gaat. Het houdt de processor of het scherm actief, zodat achtergrondtaken (downloaden, berekeningen) zonder onderbreking kunnen worden uitgevoerd. Het wordt beheerd via de systeemservice PowerManager.

Welke WakeLock-typen bestaan er?

De belangrijkste typen: PARTIAL_WAKE_LOCK (CPU actief, scherm uit) — aanbevolen; SCREEN_DIM_WAKE_LOCK (CPU + gedimd scherm); SCREEN_BRIGHT_WAKE_LOCK (CPU + helder scherm). SCREEN_DIM, SCREEN_BRIGHT en FULL_WAKE_LOCK zijn verouderd en vervangen door FLAG_KEEP_SCREEN_ON.

Is toestemming nodig voor WakeLock?

Ja, in het manifest moet android.permission.WAKE_LOCK worden gedeclareerd. Dit is een normale toestemming (normal permission) die automatisch wordt verleend bij installatie — deze hoeft niet in runtime te worden aangevraagd. Zonder deze toestemming retourneert newWakeLock() null of wordt SecurityException gegooid.

Wat gebeurt er als ik WakeLock niet vrijgeef?

Als release() niet wordt aangeroepen, kan het apparaat niet in slaapmodus gaan. De batterij zal aanzienlijk sneller leeglopen (tot 50% extra verbruik). Het systeem registreert de lekkage in logcat en Battery Historian toont een abnormale WakeLock-vasthoudtijd, wat leidt tot negatieve gebruikersbeoordelingen.

Waarmee vervang ik WakeLock in moderne apps?

Voor langdurige taken gebruikt u Foreground Service met melding — het systeem beheert WakeLock zelf. Voor uitgestelde en gegarandeerde taken gebruikt u WorkManager, die WakeLock intern ondersteunt. Voor korte geplande taken — AlarmManager.

Samenvatting

  • WakeLock — slaapblokkade die CPU of scherm van Android-apparaat actief houdt
  • PARTIAL_WAKE_LOCK — hoofdtype voor achtergrondtaken; scherm uit, CPU blijft actief
  • Toestemming — WAKE_LOCK in manifest (normal permission, runtime niet vereist)
  • Lekkages — niet-vrijgegeven WakeLock ontlaadt batterij met 30–50%; vrijgeven in finally of via timeout
  • Verouderd — SCREEN_DIM, SCREEN_BRIGHT en FULL_WAKE_LOCK vervangen door FLAG_KEEP_SCREEN_ON
  • Foreground Service — alternatief met automatisch WakeLock-beheer en melding
  • WorkManager — beste keuze voor uitgestelde achtergrondtaken met gegarandeerde uitvoering

We ontwikkelen een mobiele applicatie turnkey

IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.

Bespreek het project

Lees ook