WakeLock: mi ez, az alvászár típusai és kezelése

Szerző: IT Sectr Megjelenés: 2026-03-28 Olvasási idő: 9 perc

A WakeLock egy Android mechanizmus, amely megakadályozza az eszköz alvó módba kapcsolását, a processzor vagy a képernyő aktív állapotban tartásával. A háttérfeladatok, mint a fájlok letöltése, audió lejátszása vagy adatok rögzítése, WakeLock-ot igényelnek a garantált megszakítás nélküli végrehajtáshoz. A Android Developers, 2025 specifikáció szerint a WakeLock helytelen használata az akkumulátor gyors lemerüléséhez vezet, és az alkalmazás Google Play-beli blokkolását okozhatja.

Főbb pontok

  • WakeLock — alvászár, amely az eszközt aktív állapotban tartja
  • Típusok — PARTIAL_WAKE_LOCK, FULL_WAKE_LOCK, SCREEN_DIM_WAKE_LOCK és mások
  • Engedély — WAKE_LOCK szükséges a manifestben, de nem kérhető futásidőben
  • Kockázatok — a fel nem oldott WakeLock lemeríti az akkumulátort és rontja a felhasználói élményt
  • Alternatívák — WorkManager, Foreground Service, JobScheduler csökkentik a WakeLock szükségességét

Mi az a WakeLock

WakeLock egy rendszerzár, amely megtiltja az Androidnak, hogy az eszközt alacsony energiafogyasztású módba kapcsolja. Általában az Android néhány másodperc felhasználói inaktivitás után kikapcsolja a képernyőt és a processzort mélyalvás (deep sleep) állapotba helyezi, ahol a háttérszálak felfüggesztésre kerülnek. A WakeLock megakadályozza ezt az átmenetet, a CPU-t aktív módban tartva.

A WakeLock mechanizmus a PowerManager rendszerszolgáltatáson keresztül történik, amely a getSystemService(Context.POWER_SERVICE) metódussal érhető el. A fejlesztő létrehoz egy WakeLock objektumot a zár típusának megadásával, és garantáltan fel kell oldania a feladat befejezése után, különben az eszköz akkumulátora gyorsan lemerül. A rendszer nem oldja fel automatikusan a WakeLock-ot — ez az alkalmazás felelőssége.

Az Android minden nagyobb verziójával a Google szigorítja a WakeLock feletti ellenőrzést. Android 9-től (API 28) kezdve a háttérben futó alkalmazás nem kaphat WakeLock-ot alapos ok nélkül, és a rendszer figyeli a zárakkal visszaélő alkalmazásokat, és kényszerrel feloldhatja azokat. Android 12+-ban további korlátozásokat vezettek be a PowerManagerhez való hozzáférésre a háttéralkalmazások számára.

Mikor szükséges a WakeLock

WakeLock olyan forgatókönyvekben szükséges, ahol a feladat nem szakítható meg az eszköz alvásba kapcsolásával: nagy fájl letöltése instabil kapcsolaton keresztül, videó felvétel, hosszú számítások végrehajtása felhasználói részvétel nélkül. Alvászár nélkül a processzor mélyalvásba kerül, az összes szál (thread) befagy, és a feladat befejezetlen marad.

A Google azonban határozottan ajánlja a WakeLock használatának minimalizálását. A legtöbb esetben ugyanaz a feladat megoldható Foreground Service-szel értesítéssel, WorkManager-rel vagy JobScheduler-rel. Ezek a mechanizmusok figyelembe veszik az akkumulátor és a hálózat állapotát, ami meghosszabbítja az eszköz akkumulátoros üzemidejét.

Hogyan működik a WakeLock

WakeLock a PowerManager rendszerszolgáltatáson keresztül működik, amely az eszköz tápellátási állapotát kezeli. Amikor az alkalmazás zárat kér a powerManager.newWakeLock()-on keresztül, a rendszer megemeli a CPU aktivitási szintjét, megakadályozva a mélyalvásba kerülést. A wakeLock.release() meghívása után a rendszer visszatér a normál energiatakarékos módba.

Fontos megérteni, hogy a WakeLock nem akadályozza meg az összes energiatakarékos módot. Doze Mode (Android 6+ alvó mód) bizonyos fázisokban figyelmen kívül hagyhatja a WakeLock-ot — a WakeLock-ot fenntartó alkalmazás nem fér hozzá a hálózathoz a Doze karbantartási ablakaiban. Ez azt jelenti, hogy még egy aktív WakeLock sem garantálja a hálózati műveletek végrehajtását a Doze második fázisában.

Minden WakeLock a PowerManager.WakeLock-hoz kapcsolódik a keretrendszer oldalán. A rendszer nyilvántartja az aktív zárak számát folyamat szinten: ha egy folyamat több WakeLock-ot tart fenn, azok összeadódnak, és a feloldás csak az egyes zárak release() meghívása után történik. Az Android támogatja a wake lock timeouts-ot is — automatikus feloldás megadott időköz után. A timeouthoz való támaszkodás azonban nem ajánlott: a feladat korábban is véget érhet, és a többlet fenntartási idő csökkenti az akkumulátor élettartamát.

WakeLock és rendszeresemények

Amikor az eszköz alvó módba kapcsol (bekapcsoló gomb), az Android kényszerrel feloldja az összes SCREEN_DIM_WAKE_LOCK és SCREEN_BRIGHT_WAKE_LOCK zárat, de megtartja a PARTIAL_WAKE_LOCK-ot. Ez azt jelenti, hogy a képernyőzár nem akadályozhatja meg az eszközt a kijelző kikapcsolásában — csak a PARTIAL_WAKE_LOCK képes folytatni a működést a bekapcsoló gomb megnyomása után.

WakeLock típusok Androidban

Androidban több WakeLock típus létezik, amelyek mindegyike az eszköz meghatározott összetevőit kezeli. A típus kiválasztása határozza meg, hogy mely hardverkomponensek maradnak aktívak a zár után. A helytelen típusválasztás túlzott energiafogyasztáshoz vezet a szükségtelen modulok bekapcsolása miatt.

TípusCPUKépernyőBillentyűzetMikor használjuk
PARTIAL_WAKE_LOCKBeKiKiFájl letöltés, számítások
SCREEN_DIM_WAKE_LOCKBeHalványKiVideólejátszó, prezentáció
SCREEN_BRIGHT_WAKE_LOCKBeVilágosKiJátékok (elavult)
FULL_WAKE_LOCKBeVilágosVilágosElavult (deprecated)

PARTIAL_WAKE_LOCK — a fő típus

PARTIAL_WAKE_LOCK a leggyakrabban használt és ajánlott típus. A CPU-t aktív módban tartja, de lehetővé teszi a képernyő és a billentyűzet háttérvilágításának kikapcsolását. Ez az optimális választás háttérfeladatokhoz: adatok letöltése, képek feldolgozása, szinkronizálás. A képernyő a rendszer időtúllépése után kialszik, ami akkumulátort takarít meg a felhasználó számára láthatatlan munka végzése közben.

Elavult típusok (deprecated)

SCREEN_DIM_WAKE_LOCK, SCREEN_BRIGHT_WAKE_LOCK és FULL_WAKE_LOCK elavultnak minősülnek Android 7-től (API 24) kezdve. Ezek bekapcsolva tartják a képernyőt, ami jelentős akkumulátor-fogyasztáshoz vezet. A Google helyettük a FLAG_KEEP_SCREEN_ON használatát ajánlja a Activity.getWindow().addFlags()-on keresztül — ez a jelző csak aktív Activity-vel működik, és nem igényel WAKE_LOCK engedélyt, a rendszer pedig automatikusan kezeli a képernyő fenntartási idejét.

WakeLock és energiafogyasztás

WakeLock az egyik fő akkumulátor-fogyasztó Androidon. Az alvászár minden egyes másodperce plusz energiát fogyaszt, mivel a processzor nem tud energiatakarékos C-state állapotba kerülni. A Google Power Dashboard kutatása azt mutatja, hogy a helytelenül feloldott WakeLock-okat tartalmazó alkalmazások 30–50%-kal növelhetik az eszköz energiafogyasztását készenléti módban.

A rendszer a WakeLock-kal visszaélő alkalmazásokat a Battery Historian komponensen keresztül figyeli. A fejlesztő elemezheti az energiafogyasztási profilt és észlelheti a zárszivárgásokat — olyan helyzeteket, amikor a WakeLock létrejött, de nem oldódott fel. A Google Play Console statisztikákat jelenít meg a közzétett alkalmazások WakeLock-jairól, és a hosszú fenntartási idő rossz értékelésekhez vezethet.

Doze Mode és App Standby tovább korlátozzák a WakeLock működését. A Doze első fázisában (Light Doze) a rendszer rövid karbantartási ablakokban engedélyezi a WakeLock-ot. A második fázisban (Deep Doze) a WakeLock más zárakkal egyesül és közös ablakban fut. Ha egy alkalmazás 10 percnél tovább tart fenn WakeLock-ot felhasználói interakció nélkül, a rendszer kényszerrel feloldhatja, és az alkalmazást az akkumulátor-optimalizálás feketelistájára helyezheti.

  • Battery Historian — eszköz az energiafogyasztás és a WakeLock-szivárgások elemzéséhez
  • Doze Mode — korlátozza a WakeLock-ot karbantartási ablakokban, egyesítve a zárakat
  • Google Play Console — WakeLock-statisztikákat jelenít meg közzétett alkalmazásokhoz
  • Feketelista — az alkalmazást a rendszer energiaigényesként jelölheti meg

Legjobb gyakorlatok a használathoz

A WakeLock helyes használata egyensúly a feladat végrehajtásának szükségessége és az eszköz akkumulátorára való odafigyelés között. A Google néhány elv betartását ajánlja: mindig oldd fel a WakeLock-ot a finally-ban vagy acquire(timeout)-on keresztül, használd a minimálisan szükséges zártípust, és kerüld a hosszan tartó fenntartást szükségtelenül.

Feloldási szabály

WakeLock-ot ugyanabban a kódblokkban kell feloldani, ahol létrehozták. A kivételek esetén történő garantált feloldáshoz a try-finally szerkezetet vagy a Kotlin use blokkját használjuk. Android 10+-on a rendszer figyelmeztetést jelenít meg a logcat-ben, ha a WakeLock-ot 60 másodpercnél tovább tartják fenn: "WakeLock held for more than 60 seconds" — ez egy lehetséges szivárgás jele.

Időtúllépés a megszerzéskor

A acquire(long timeout) metódus automatikusan feloldja a WakeLock-ot a megadott milliszekundum idő után. Ez biztosíték arra az esetre, ha a feloldó kód nem futna le kivétel vagy hiba miatt. Ajánlott mindig olyan időtúllépést megadni, amely megegyezik a feladat maximális várható végrehajtási idejével plusz 10–20% tartalékkal.

A zár meglétének ellenőrzése

A release() meghívása előtt ellenőrizni kell, hogy a WakeLock jelenleg fenn van-e tartva. A release() ismételt meghívása előzetes acquire() nélkül RuntimeException: WakeLock under-locked kivételt okoz. Ajánlott állapotjelzőt (isHeld) tárolni és a feloldás előtt ellenőrizni a wakeLock.isHeld()-et.

WakeLock használata Kotlinban

Vizsgáljuk meg a WakeLock helyes létrehozását és feloldását Kotlinban. A példa aszinkron adatletöltést mutat be PARTIAL_WAKE_LOCK fenntartásával, garantált feloldással a try-finally blokkban és időtúllépés megadásával a szivárgások elleni védelemhez. A szolgáltatás CoroutineScope-ot használ IO ütemezővel a háttérfeladat végrehajtásához.

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() {
        // Fájlletöltés szimulációja
        delay(30000)
    }

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

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

Engedély deklarálása a manifestben

A WakeLock használatához engedélyt kell hozzáadni az AndroidManifest.xml-hez. A WAKE_LOCK engedély normál (normal) engedély — nem igényel futásidejű kérést a felhasználótól, és automatikusan megadásra kerül az alkalmazás telepítésekor. Ennek ellenére a Google Play elutasíthatja a közzétételt, ha az alkalmazásnak nincs egyértelmű WakeLock-használati forgatókönyve.

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

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

WakeLock alternatívák

WakeLock egy alacsony szintű mechanizmus, és a Google ajánlja, hogy lehetőség szerint modernebb API-kkal helyettesítsük. A fő alternatíva az értesítéssel ellátott Foreground Service, amely automatikusan fenntartja a CPU-zárat a szolgáltatás működése során. A rendszer maga kezeli a WakeLock-ot a Foreground Service számára, megszabadítva a fejlesztőt az explicit megszerzés és feloldás szükségességétől.

WorkManager a második legfontosabb eszköz a háttérfeladatokhoz. Garantálja a munka végrehajtását még az eszköz Doze-ba kapcsolásakor és újraindítás után is. A WorkManager támogatja a zár fenntartását (hold lock) belsőleg — a fejlesztőnek nem kell explicit módon dolgoznia a PowerManager-rel. A feladat a Doze karbantartási ablakában fut az alvászár automatikus kezelésével.

A rendszeres, pontos időzítést igénylő feladatokhoz AlarmManager használható a setAndAllowWhileIdle()-lal, amely képes felébreszteni az eszközt Doze-ból. Az AlarmManager azonban csak rövid műveletekhez alkalmas — nem hosszú távú WakeLock fenntartásra tervezték. Ha a feladat 10 másodpercnél tovább tart, az AlarmManager-t kombinálni kell egy BroadcastReceiver-rel, amely elindítja a Foreground Service-t.

  • Foreground Service — automatikus WakeLock-kezelés értesítéssel
  • WorkManager — garantált végrehajtás a Doze és újraindítás figyelembevételével
  • JobScheduler — ütemezés a hálózat, töltés és tétlenség figyelembevételével
  • AlarmManager — eszköz ébresztése rövid feladatokhoz ütemezés szerint

Gyakran Ismételt Kérdések

Mi az a WakeLock Androidban?

WakeLock egy rendszerzár, amely megakadályozza az Android-eszköz alvó módba kapcsolását. A processzort vagy a képernyőt aktívan tartja, lehetővé téve a háttérfeladatok (letöltés, számítások) megszakítás nélküli végrehajtását. A PowerManager rendszerszolgáltatáson keresztül kezelhető.

Milyen WakeLock típusok léteznek?

Fő típusok: PARTIAL_WAKE_LOCK (CPU aktív, képernyő ki) — ajánlott; SCREEN_DIM_WAKE_LOCK (CPU + halvány képernyő); SCREEN_BRIGHT_WAKE_LOCK (CPU + világos képernyő). A SCREEN_DIM, SCREEN_BRIGHT és FULL_WAKE_LOCK elavult, helyettesítve a FLAG_KEEP_SCREEN_ON-nal.

Szükséges engedély a WakeLock-hoz?

Igen, a manifestben deklarálni kell az android.permission.WAKE_LOCK-ot. Ez egy normál engedély (normal permission), amely automatikusan megadásra kerül telepítéskor — nem kell futásidőben kérni. Ezen engedély nélkül a newWakeLock() hívás null-t ad vissza vagy SecurityException-t dob.

Mi történik, ha nem oldom fel a WakeLock-ot?

Ha nem hívja meg a release()-et, az eszköz nem tud alvó módba kapcsolni. Az akkumulátor jelentősen gyorsabban lemerül (akár 50% többletfogyasztás). A rendszer rögzíti a szivárgást a logcat-ben, és a Battery Historian rendellenes WakeLock-fenntartási időt mutat, ami rossz felhasználói értékelésekhez vezet.

Mivel váltsam ki a WakeLock-ot modern alkalmazásokban?

Hosszú feladatokhoz használjon Foreground Service-t értesítéssel — a rendszer maga kezeli a WakeLock-ot. Elhalasztott és garantált feladatokhoz használjon WorkManager-t, amely belsőleg támogatja a WakeLock-ot. Rövid ütemezett feladatokhoz — AlarmManager.

Összefoglalás

  • WakeLock — alvászár, amely az Android-eszköz CPU-ját vagy képernyőjét aktívan tartja
  • PARTIAL_WAKE_LOCK — fő típus háttérfeladatokhoz; képernyő ki, CPU aktív marad
  • Engedély — WAKE_LOCK a manifestben (normal permission, futásidőben nem szükséges)
  • Szivárgás — a fel nem oldott WakeLock 30–50%-kal meríti az akkumulátort; oldd fel finally-ban vagy timeout-tal
  • Elavult — SCREEN_DIM, SCREEN_BRIGHT és FULL_WAKE_LOCK helyettesítve FLAG_KEEP_SCREEN_ON-nal
  • Foreground Service — alternatíva automatikus WakeLock-kezeléssel és értesítéssel
  • WorkManager — legjobb választás elhalasztott háttérfeladatokhoz garantált végrehajtással

Kulcsrakész mobilalkalmazást fejlesztünk

Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.

Projekt megbeszélése

Olvassa el is