WakeLock: co to je, typy a správa blokování spánku

Autor: IT Sectr Publikováno: 2026-03-28 Doba čtení: 9 min

WakeLock je mechanismus Androidu, který zabraňuje přechodu zařízení do režimu spánku tím, že udržuje procesor nebo obrazovku v aktivním stavu. Úlohy na pozadí, jako je stahování souborů, přehrávání audia nebo záznam dat, vyžadují WakeLock pro zaručené provedení bez přerušení. Podle specifikace Android Developers, 2025, nesprávné použití WakeLock vede k rychlému vybití baterie a může způsobit zablokování aplikace v Google Play.

Hlavní body

  • WakeLock — blokování spánku, udržující zařízení v aktivním stavu
  • Typy — PARTIAL_WAKE_LOCK, FULL_WAKE_LOCK, SCREEN_DIM_WAKE_LOCK a další
  • Oprávnění — WAKE_LOCK vyžadováno v manifestu, ale nevyžaduje se za běhu
  • Rizika — neuvolněný WakeLock vybíjí baterii a zhoršuje uživatelský zážitek
  • Alternativy — WorkManager, Foreground Service, JobScheduler snižují potřebu WakeLock

Co je WakeLock

WakeLock je systémový zámek, který zakazuje Androidu přepnout zařízení do režimu nízké spotřeby energie. Obvykle Android po několika sekundách nečinnosti uživatele vypne obrazovku a přepne procesor do stavu hlubokého spánku (deep sleep), při kterém jsou vlákna na pozadí pozastavena. WakeLock tomuto přechodu zabraňuje tím, že udržuje CPU v aktivním režimu.

Mechanismus WakeLock je spravován prostřednictvím systémové služby PowerManager, ke které se přistupuje pomocí metody getSystemService(Context.POWER_SERVICE). Vývojář vytvoří objekt WakeLock s uvedením typu zámku a musí jej zaručeně uvolnit po dokončení úkolu, jinak se baterie zařízení rychle vybije. Systém neuvolňuje WakeLock automaticky — to je odpovědnost aplikace.

S každou hlavní verzí Androidu Google zpřísňuje kontrolu nad WakeLock. Počínaje Androidem 9 (API 28), aplikace na pozadí nemůže získat WakeLock bez závažného důvodu a systém sleduje aplikace zneužívající zámky a může je násilně uvolnit. V Androidu 12+ byla zavedena další omezení přístupu k PowerManager pro aplikace na pozadí.

Kdy je WakeLock nezbytný

WakeLock je vyžadován ve scénářích, kde úloha nemůže být přerušena přechodem zařízení do spánku: stahování velkého souboru přes nestabilní připojení, nahrávání videa, provádění dlouhých výpočtů bez účasti uživatele. Bez blokování spánku procesor přejde do hlubokého spánku, všechna vlákna (threads) se zmrazí a úloha zůstane nedokončená.

Google však důrazně doporučuje minimalizovat používání WakeLock. Ve většině případů lze stejný úkol vyřešit pomocí Foreground Service s oznámením, WorkManager nebo JobScheduler. Tyto mechanismy berou v úvahu stav baterie a sítě, což prodlužuje dobu provozu zařízení na baterii.

Jak WakeLock funguje

WakeLock funguje prostřednictvím systémové služby PowerManager, která spravuje stav napájení zařízení. Když aplikace požádá o zámek přes powerManager.newWakeLock(), systém zvýší úroveň aktivity CPU a zabrání přechodu do hlubokého spánku. Po volání wakeLock.release() se systém vrátí do normálního režimu úspory energie.

Je důležité pochopit, že WakeLock nezabraňuje všem režimům úspory energie. Doze Mode (režim spánku Android 6+) může v určitých fázích WakeLock ignorovat — aplikace s drženým WakeLock nezíská přístup k síti v oknech údržby Doze. To znamená, že ani aktivní WakeLock nezaručuje provádění síťových operací během druhé fáze Doze.

Každý WakeLock je spojen s PowerManager.WakeLock na straně frameworku. Systém vede počítadlo aktivních zámků na úrovni procesu: pokud jeden proces drží několik WakeLock, sčítají se a uvolnění nastane až po volání release() pro každý zámek. Android také podporuje wake lock timeouts — automatické uvolnění po nastaveném intervalu. Spoléhání se na timeout se však nedoporučuje: úloha může skončit dříve a další doba držení zkrátí životnost baterie.

WakeLock a systémové události

Při přechodu zařízení do režimu spánku (tlačítko napájení) Android násilně uvolní všechny SCREEN_DIM_WAKE_LOCK a SCREEN_BRIGHT_WAKE_LOCK, ale zachová PARTIAL_WAKE_LOCK. To znamená, že zámek obrazovky nemůže zabránit zařízení ve vypnutí displeje — pouze PARTIAL_WAKE_LOCK je schopen pokračovat v činnosti po stisknutí tlačítka napájení.

Typy WakeLock v Androidu

V Androidu existuje několik typů WakeLock, z nichž každý spravuje specifické komponenty zařízení. Výběr typu určuje, které hardwarové komponenty zůstanou po zámku aktivní. Nesprávný výběr typu vede k nadměrné spotřebě energie kvůli zapnutí nepotřebných modulů.

TypCPUObrazovkaKlávesniceKdy použít
PARTIAL_WAKE_LOCKZap.Vyp.Vyp.Stahování souborů, výpočty
SCREEN_DIM_WAKE_LOCKZap.ZtlumenáVyp.Přehrávač videa, prezentace
SCREEN_BRIGHT_WAKE_LOCKZap.JasnáVyp.Hry (zastaralé)
FULL_WAKE_LOCKZap.JasnáJasnáZastaralé (deprecated)

PARTIAL_WAKE_LOCK — hlavní typ

PARTIAL_WAKE_LOCK je nejčastěji používaný a doporučovaný typ. Udržuje CPU v aktivním režimu, ale umožňuje vypnout obrazovku a podsvícení klávesnice. To je optimální volba pro úlohy na pozadí: stahování dat, zpracování obrázků, synchronizace. Obrazovka zhasne po systémovém časovém limitu, což šetří baterii při provádění práce neviditelné pro uživatele.

Zastaralé typy (deprecated)

SCREEN_DIM_WAKE_LOCK, SCREEN_BRIGHT_WAKE_LOCK a FULL_WAKE_LOCK jsou označeny jako zastaralé od Androidu 7 (API 24). Udržují obrazovku zapnutou, což vede k výrazné spotřebě baterie. Google doporučuje místo nich používat FLAG_KEEP_SCREEN_ON přes Activity.getWindow().addFlags() — tento příznak funguje pouze s aktivní Activity a nevyžaduje oprávnění WAKE_LOCK a systém automaticky spravuje dobu držení obrazovky.

WakeLock a spotřeba energie

WakeLock je jedním z hlavních „žroutů" baterie na Androidu. Každá sekunda držení zámku spánku spotřebovává další energii, protože procesor nemůže přejít do energeticky úsporného stavu C-state. Výzkum Google Power Dashboard ukazuje, že aplikace s nesprávně uvolněnými WakeLock mohou zvýšit spotřebu energie zařízení o 30–50% v pohotovostním režimu.

Systém sleduje aplikace zneužívající WakeLock pomocí komponenty Battery Historian. Vývojář může analyzovat profil spotřeby energie a odhalit „úniky" zámků — situace, kdy byl WakeLock vytvořen, ale nebyl uvolněn. Google Play Console zobrazuje statistiku WakeLock pro publikované aplikace a dlouhá doba držení může být důvodem špatných hodnocení.

Doze Mode a App Standby dále omezují činnost WakeLock. V první fázi Doze (Light Doze) systém povoluje WakeLock v krátkých oknech údržby. Ve druhé fázi (Deep Doze) je WakeLock sloučen s ostatními zámky a prováděn ve společném okně. Pokud aplikace drží WakeLock déle než 10 minut bez interakce uživatele, systém jej může násilně uvolnit a zařadit aplikaci na černou listinu optimalizace baterie.

  • Battery Historian — nástroj pro analýzu spotřeby energie a úniků WakeLock
  • Doze Mode — omezuje WakeLock v oknech údržby, slučuje zámky
  • Google Play Console — zobrazuje statistiku WakeLock pro publikované aplikace
  • Černá listina — aplikace může být systémem označena jako energeticky náročná

Nejlepší postupy použití

Správné použití WakeLock je rovnováha mezi potřebou provést úlohu a ohledem na baterii zařízení. Google doporučuje dodržovat několik zásad: vždy uvolňujte WakeLock v finally nebo přes acquire(timeout), používejte minimálně nutný typ zámku a vyhýbejte se dlouhodobému držení bez krajní nutnosti.

Pravidlo uvolnění

WakeLock by měl být uvolněn ve stejném bloku kódu, kde byl vytvořen. Pro zaručené uvolnění při výjimkách se používá konstrukce try-finally nebo blok use v Kotlinu. Na Androidu 10+ systém zobrazuje varování v logcat, pokud je WakeLock držen déle než 60 sekund: "WakeLock held for more than 60 seconds" — to je signál možného úniku.

Časový limit při získávání

Metoda acquire(long timeout) automaticky uvolní WakeLock po zadaném čase v milisekundách. To je pojistka pro případ, že by se uvolňovací kód neprovedl kvůli výjimce nebo chybě. Doporučuje se vždy nastavit timeout rovný maximálnímu očekávanému času provedení úlohy plus 10–20% rezervy.

Kontrola existence zámku

Před voláním release() byste měli zkontrolovat, zda je WakeLock aktuálně držen. Opakované volání release() bez předchozího acquire() způsobí RuntimeException: WakeLock under-locked. Doporučuje se ukládat stavový příznak (isHeld) a před uvolněním zkontrolovat wakeLock.isHeld().

Použití WakeLock v Kotlinu

Podívejme se na správné vytvoření a uvolnění WakeLock v Kotlinu. Příklad ukazuje asynchronní stahování dat s držením PARTIAL_WAKE_LOCK, zaručeným uvolněním v bloku try-finally a nastavením timeoutu pro ochranu před úniky. Služba používá CoroutineScope s dispečerem IO pro provedení úlohy na pozadí.

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() {
        // Simulace stahování souboru
        delay(30000)
    }

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

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

Deklarace oprávnění v manifestu

Pro použití WakeLock je třeba přidat oprávnění do AndroidManifest.xml. Oprávnění WAKE_LOCK je normální (normal) — nevyžaduje runtime dotaz od uživatele a je uděleno automaticky při instalaci aplikace. Nicméně Google Play může odmítnout publikaci, pokud aplikace nemá zřejmý scénář použití WakeLock.

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

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

Alternativy k WakeLock

WakeLock je nízkoúrovňový mechanismus a Google doporučuje, pokud je to možné, nahradit jej modernějšími API. Hlavní alternativou je Foreground Service s oznámením, která automaticky udržuje zámek CPU po dobu činnosti služby. Systém sám spravuje WakeLock pro Foreground Service, čímž zbavuje vývojáře nutnosti explicitního získávání a uvolňování.

WorkManager je druhý nejdůležitější nástroj pro úlohy na pozadí. Zaručuje provedení práce i při přechodu zařízení do Doze a po restartu. WorkManager podporuje držení zámku (hold lock) interně — vývojář nemusí explicitně pracovat s PowerManager. Úloha se provádí v okně údržby Doze s automatickou správou zámku spánku.

Pro pravidelné úlohy vyžadující přesný čas se používá AlarmManager s setAndAllowWhileIdle(), který může probudit zařízení z Doze. AlarmManager je však vhodný pouze pro krátké operace — není určen k dlouhodobému držení WakeLock. Pokud úloha trvá déle než 10 sekund, je třeba AlarmManager zkombinovat s BroadcastReceiver, který spustí Foreground Service.

  • Foreground Service — automatická správa WakeLock s oznámením
  • WorkManager — garantované provedení s ohledem na Doze a restart
  • JobScheduler — plánování s ohledem na síť, nabíjení a nečinnost
  • AlarmManager — probuzení zařízení pro krátké úlohy podle plánu

Často kladené otázky

Co je WakeLock v Androidu?

WakeLock je systémový zámek, který zabraňuje zařízení s Androidem přejít do režimu spánku. Udržuje procesor nebo obrazovku v aktivním stavu a umožňuje úlohám na pozadí (stahování, výpočty) běžet bez přerušení. Je spravován prostřednictvím systémové služby PowerManager.

Jaké typy WakeLock existují?

Hlavní typy: PARTIAL_WAKE_LOCK (CPU aktivní, obrazovka vypnutá) — doporučeno; SCREEN_DIM_WAKE_LOCK (CPU + ztlumená obrazovka); SCREEN_BRIGHT_WAKE_LOCK (CPU + jasná obrazovka). SCREEN_DIM, SCREEN_BRIGHT a FULL_WAKE_LOCK jsou zastaralé a nahrazeny FLAG_KEEP_SCREEN_ON.

Je potřeba oprávnění pro WakeLock?

Ano, v manifestu je třeba deklarovat android.permission.WAKE_LOCK. Jedná se o normální oprávnění (normal permission), které je uděleno automaticky při instalaci — není třeba ho žádat za běhu. Bez tohoto oprávnění volání newWakeLock() vrátí null nebo vyvolá SecurityException.

Co se stane, když neuvolním WakeLock?

Pokud není zavoláno release(), zařízení nebude moci přejít do režimu spánku. Baterie se bude vybíjet výrazně rychleji (až o 50% vyšší spotřeba). Systém zaznamená únik v logcat a Battery Historian ukáže anomální dobu držení WakeLock, což povede k negativním hodnocením uživatelů.

Čím nahradit WakeLock v moderních aplikacích?

Pro dlouhé úlohy používejte Foreground Service s oznámením — systém sám spravuje WakeLock. Pro odložené a garantované úlohy používejte WorkManager, který interně podporuje WakeLock. Pro krátké plánované úlohy — AlarmManager.

Shrnutí

  • WakeLock — zámek spánku, udržující CPU nebo obrazovku zařízení s Androidem v aktivním stavu
  • PARTIAL_WAKE_LOCK — hlavní typ pro úlohy na pozadí, obrazovka vypnutá, CPU zůstává aktivní
  • Oprávnění — WAKE_LOCK v manifestu (normal permission, runtime není vyžadováno)
  • Úniky — neuvolněný WakeLock vybíjí baterii o 30–50%, uvolňujte v finally nebo přes timeout
  • Zastaralé — SCREEN_DIM, SCREEN_BRIGHT a FULL_WAKE_LOCK nahrazeny FLAG_KEEP_SCREEN_ON
  • Foreground Service — alternativa s automatickou správou WakeLock a oznámením
  • WorkManager — nejlepší volba pro odložené úlohy na pozadí s garantovaným provedením

Vyvineme mobilní aplikaci na klíč

IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.

Prodiskutovat projekt

Přečtěte si také