WakeLock este un mecanism Android care împiedică trecerea dispozitivului în modul de repaus, menținând procesorul sau ecranul în stare activă. Sarcinile din fundal, cum ar fi descărcarea fișierelor, redarea audio sau înregistrarea datelor, necesită WakeLock pentru executarea garantată fără întreruperi. Conform specificației Android Developers, 2025, utilizarea incorectă a WakeLock duce la descărcarea rapidă a bateriei și poate cauza blocarea aplicației în Google Play.
Principalele puncte
WakeLock este o blocare de sistem care interzice Androidului să treacă dispozitivul în modul de consum redus de energie. De obicei, Android după câteva secunde de inactivitate a utilizatorului oprește ecranul și trece procesorul în stare de somn profund (deep sleep), în care firele de execuție din fundal sunt suspendate. WakeLock previne această tranziție, menținând CPU în modul activ.
Mecanismul WakeLock este gestionat prin serviciul de sistem PowerManager, la care se accesează prin metoda getSystemService(Context.POWER_SERVICE). Dezvoltatorul creează un obiect WakeLock specificând tipul blocării și trebuie să îl elibereze garantat după finalizarea sarcinii, altfel acumulatorul dispozitivului se va descărca rapid. Sistemul nu eliberează WakeLock automat — aceasta este responsabilitatea aplicației.
Cu fiecare versiune majoră de Android, Google înăsprește controlul asupra WakeLock. Începând cu Android 9 (API 28), o aplicație în fundal nu poate obține WakeLock fără un motiv întemeiat, iar sistemul urmărește aplicațiile care abuzează de blocări și le poate elibera forțat. În Android 12+ au fost introduse restricții suplimentare privind accesul la PowerManager pentru aplicațiile de fundal.
WakeLock este necesar în scenarii în care sarcina nu poate fi întreruptă de trecerea dispozitivului în repaus: descărcarea unui fișier mare printr-o conexiune instabilă, înregistrarea video, efectuarea de calcule lungi fără participarea utilizatorului. Fără blocarea de somn, procesorul intră în somn profund, toate firele de execuție (threads) sunt înghețate, iar sarcina rămâne nefinalizată.
Cu toate acestea, Google recomandă insistent minimizarea utilizării WakeLock. În majoritatea cazurilor, aceeași sarcină poate fi rezolvată cu Foreground Service cu notificare, WorkManager sau JobScheduler. Aceste mecanisme iau în considerare starea bateriei și a rețelei, ceea ce prelungește durata de funcționare autonomă a dispozitivului.
WakeLock funcționează prin serviciul de sistem PowerManager care gestionează starea de alimentare a dispozitivului. Când aplicația solicită blocarea prin powerManager.newWakeLock(), sistemul crește nivelul de activitate al CPU, prevenind tranziția în somn profund. După apelarea wakeLock.release(), sistemul revine la modul normal de economisire a energiei.
Este important de înțeles că WakeLock nu previne toate modurile de economisire a energiei. Doze Mode (modul de repaus Android 6+) poate ignora WakeLock în anumite faze — aplicația cu WakeLock menținut nu va avea acces la rețea în ferestrele de întreținere Doze. Aceasta înseamnă că chiar și un WakeLock activ nu garantează executarea operațiunilor de rețea în timpul fazei a doua a Doze.
Fiecare WakeLock este asociat cu PowerManager.WakeLock la nivel de framework. Sistemul menține un contor al blocărilor active la nivel de proces: dacă un proces menține mai multe WakeLock, acestea se cumulează, iar eliberarea are loc numai după apelarea release() pentru fiecare blocare. Android acceptă și wake lock timeouts — eliberarea automată după un interval specificat. Cu toate acestea, nu se recomandă să te bazezi pe timeout: sarcina se poate termina mai devreme, iar timpul suplimentar de menținere va reduce durata de viață a bateriei.
La trecerea dispozitivului în modul de repaus (butonul de alimentare), Android eliberează forțat toate SCREEN_DIM_WAKE_LOCK și SCREEN_BRIGHT_WAKE_LOCK, dar păstrează PARTIAL_WAKE_LOCK. Aceasta înseamnă că blocarea ecranului nu poate împiedica dispozitivul să oprească afișajul — numai PARTIAL_WAKE_LOCK poate continua să funcționeze după apăsarea butonului de alimentare.
În Android există mai multe tipuri de WakeLock, fiecare gestionând componente specifice ale dispozitivului. Alegerea tipului determină care componente hardware rămân active după blocare. Alegerea incorectă a tipului duce la consum excesiv de energie din cauza activării modulelor inutile.
| Tip | CPU | Ecran | Tastatură | Când să folosești |
|---|---|---|---|---|
| PARTIAL_WAKE_LOCK | Pornit | Oprit | Oprit | Descărcare fișiere, calcule |
| SCREEN_DIM_WAKE_LOCK | Pornit | Estompat | Oprit | Player video, prezentare |
| SCREEN_BRIGHT_WAKE_LOCK | Pornit | Luminos | Oprit | Jocuri (învechit) |
| FULL_WAKE_LOCK | Pornit | Luminos | Luminoasă | Învechit (deprecated) |
PARTIAL_WAKE_LOCK este cel mai frecvent utilizat și recomandat tip. Menține CPU în modul activ, dar permite ecranului și iluminării tastaturii să se oprească. Este alegerea optimă pentru sarcinile de fundal: descărcarea datelor, procesarea imaginilor, sincronizarea. Ecranul se stinge după timeout-ul sistemului, ceea ce economisește bateria în timpul executării unei lucrări invizibile pentru utilizator.
SCREEN_DIM_WAKE_LOCK, SCREEN_BRIGHT_WAKE_LOCK și FULL_WAKE_LOCK sunt marcate ca învechite începând cu Android 7 (API 24). Acestea mențin ecranul pornit, ceea ce duce la un consum semnificativ de baterie. Google recomandă în locul lor utilizarea FLAG_KEEP_SCREEN_ON prin Activity.getWindow().addFlags() — acest flag funcționează doar cu Activity activă și nu necesită permisiunea WAKE_LOCK, iar sistemul gestionează automat timpul de menținere a ecranului.
WakeLock este unul dintre principalii „consumatori" de baterie pe Android. Fiecare secundă de menținere a blocării de somn consumă energie suplimentară, deoarece procesorul nu poate trece în starea eficientă energetic C-state. Cercetarea Google Power Dashboard arată că aplicațiile cu WakeLock eliberate incorect pot crește consumul de energie al dispozitivului cu 30–50% în modul de așteptare.
Sistemul urmărește aplicațiile care abuzează de WakeLock prin componenta Battery Historian. Dezvoltatorul poate analiza profilul consumului de energie și poate detecta „scurgeri" de blocări — situații în care WakeLock a fost creat dar nu eliberat. Google Play Console afișează statisticile WakeLock pentru aplicațiile publicate, iar timpul lung de menținere poate duce la recenzii negative.
Doze Mode și App Standby limitează suplimentar funcționarea WakeLock. În prima fază a Doze (Light Doze), sistemul permite WakeLock în ferestre de întreținere scurte. În a doua fază (Deep Doze), WakeLock este combinat cu alte blocări și executat într-o fereastră comună. Dacă aplicația menține WakeLock mai mult de 10 minute fără interacțiunea utilizatorului, sistemul poate elibera forțat și poate pune aplicația pe lista neagră de optimizare a bateriei.
Utilizarea corectă a WakeLock reprezintă un echilibru între necesitatea de a îndeplini o sarcină și grija față de bateria dispozitivului. Google recomandă respectarea câtorva principii: eliberează întotdeauna WakeLock în finally sau prin acquire(timeout), folosește tipul minim necesar de blocare și evită menținerea prelungită fără necesitate stringentă.
WakeLock trebuie eliberat în același bloc de cod în care a fost creat. Pentru garantarea eliberării în caz de excepții se folosește construcția try-finally sau blocul use din Kotlin. Pe Android 10+, sistemul afișează un avertisment în logcat dacă WakeLock este menținut mai mult de 60 de secunde: "WakeLock held for more than 60 seconds" — acesta este un semnal al unei posibile scurgeri.
Metoda acquire(long timeout) eliberează automat WakeLock după timpul specificat în milisecunde. Aceasta este o asigurare în cazul în care codul de eliberare nu se execută din cauza unei excepții sau a unei erori. Se recomandă să specifici întotdeauna un timeout egal cu timpul maxim estimat de executare a sarcinii plus 10–20% marjă de siguranță.
Înainte de a apela release(), trebuie verificat dacă WakeLock este menținut în acel moment. Apelarea repetată a release() fără un acquire() prealabil provoacă RuntimeException: WakeLock under-locked. Se recomandă stocarea unui flag de stare (isHeld) și înainte de eliberare verificarea wakeLock.isHeld().
Să analizăm crearea și eliberarea corectă a WakeLock în Kotlin. Exemplul demonstrează descărcarea asincronă a datelor cu menținerea PARTIAL_WAKE_LOCK, eliberarea garantată în blocul try-finally și specificarea timeout pentru protecția împotriva scurgerilor. Serviciul folosește CoroutineScope cu un dispatcher IO pentru executarea sarcinii de fundal.
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() {
// Simularea descărcării fișierului
delay(30000)
}
override fun onDestroy() {
super.onDestroy()
scope.cancel()
if (wakeLock.isHeld()) {
wakeLock.release()
}
}
override fun onBind(intent: Intent): IBinder? = null
}
Pentru utilizarea WakeLock este necesar să adăugați permisiunea în AndroidManifest.xml. Permisiunea WAKE_LOCK este una normală (normal) — nu necesită solicitare runtime de la utilizator și este acordată automat la instalarea aplicației. Cu toate acestea, Google Play poate respinge publicarea dacă aplicația nu are un scenariu evident de utilizare a WakeLock.
<uses-permission
android:name="android.permission.WAKE_LOCK" />
<uses-permission
android:name="android.permission.DEVICE_POWER" />
WakeLock este un mecanism de nivel scăzut, iar Google recomandă, pe cât posibil, să fie înlocuit cu API-uri mai moderne. Principala alternativă este Foreground Service cu notificare, care menține automat blocarea CPU pe durata funcționării serviciului. Sistemul gestionează singur WakeLock pentru Foreground Service, eliberând dezvoltatorul de necesitatea de a prelua și elibera explicit.
WorkManager este al doilea instrument ca importanță pentru sarcinile de fundal. Acesta garantează executarea lucrării chiar și la trecerea dispozitivului în Doze și după repornire. WorkManager acceptă menținerea blocării (hold lock) intern — dezvoltatorul nu trebuie să lucreze explicit cu PowerManager. Sarcina se execută în fereastra de întreținere Doze cu gestionarea automată a blocării de somn.
Pentru sarcini regulate care necesită timp precis, se folosește AlarmManager cu setAndAllowWhileIdle(), care poate trezi dispozitivul din Doze. Cu toate acestea, AlarmManager este potrivit doar pentru operațiuni scurte — nu este conceput pentru menținerea prelungită a WakeLock. Dacă sarcina durează mai mult de 10 secunde, trebuie combinat AlarmManager cu BroadcastReceiver care lansează Foreground Service.
Întrebări frecvente
WakeLock este o blocare de sistem care împiedică dispozitivul Android să intre în modul de repaus. Menține procesorul sau ecranul în stare activă, permițând sarcinilor de fundal (descărcări, calcule) să se execute fără întrerupere. Este gestionat prin serviciul de sistem PowerManager.
Tipurile principale: PARTIAL_WAKE_LOCK (CPU activ, ecran oprit) — recomandat; SCREEN_DIM_WAKE_LOCK (CPU + ecran estompat); SCREEN_BRIGHT_WAKE_LOCK (CPU + ecran luminos). SCREEN_DIM, SCREEN_BRIGHT și FULL_WAKE_LOCK sunt marcate ca învechite și înlocuite cu FLAG_KEEP_SCREEN_ON.
Da, în manifest trebuie declarat android.permission.WAKE_LOCK. Este o permisiune normală (normal permission) care se acordă automat la instalare — nu trebuie solicitată în runtime. Fără această permisiune, apelul newWakeLock() returnează null sau aruncă SecurityException.
Dacă nu se apelează release(), dispozitivul nu poate intra în modul de repaus. Bateria se va descărca semnificativ mai rapid (până la 50% consum suplimentar). Sistemul va înregistra scurgerea în logcat, iar Battery Historian va indica o durată anormală de menținere a WakeLock, ceea ce va duce la recenzii negative ale utilizatorilor.
Pentru sarcini lungi, folosește Foreground Service cu notificare — sistemul gestionează singur WakeLock. Pentru sarcini amânate și garantate, folosește WorkManager, care acceptă WakeLock intern. Pentru sarcini scurte programate — AlarmManager.
Rezumat
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și