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 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.
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.
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.
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.
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ípus | CPU | Képernyő | Billentyűzet | Mikor használjuk |
|---|---|---|---|---|
| PARTIAL_WAKE_LOCK | Be | Ki | Ki | Fájl letöltés, számítások |
| SCREEN_DIM_WAKE_LOCK | Be | Halvány | Ki | Videólejátszó, prezentáció |
| SCREEN_BRIGHT_WAKE_LOCK | Be | Világos | Ki | Játékok (elavult) |
| FULL_WAKE_LOCK | Be | Világos | Világos | Elavult (deprecated) |
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.
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 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.
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.
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.
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 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.
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.
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
}
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.
<uses-permission
android:name="android.permission.WAKE_LOCK" />
<uses-permission
android:name="android.permission.DEVICE_POWER" />
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.
Gyakran Ismételt Kérdések
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ő.
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.
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.
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.
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
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.
Olvassa el is