WakeLock, Android-in cihazı yuxu rejiminə keçirməsinin qarşısını alan, prosessoru və ya ekranı aktiv vəziyyətdə saxlayan bir mexanizmdir. Faylları endirmə, audio oxutma və ya məlumatların yazılması kimi fon tapşırıqları, fasiləsiz icra üçün WakeLock tələb edir. Android Developers, 2025 spesifikasiyasına görə, WakeLock-un səhv istifadəsi batareyanın sürətlə boşalmasına gətirib çıxarır və Google Play-də tətbiqin bloklanmasına səbəb ola bilər.
Əsas məqamlar
WakeLock, Android-in cihazı aşağı enerji sərfiyyatı rejiminə keçirməsini qadağan edən sistem blokadasıdır. Adətən Android istifadəçinin bir neçə saniyə hərəkətsizliyindən sonra ekranı söndürür və prosessoru dərin yuxu (deep sleep) vəziyyətinə keçirir, bu zaman fon axınları dayandırılır. WakeLock bu keçidin qarşısını alır, CPU-nu aktiv vəziyyətdə saxlayır.
WakeLock mexanizmi PowerManager sistem xidməti vasitəsilə idarə olunur, ona getSystemService(Context.POWER_SERVICE) metodu ilə giriş əldə edilir. Tərtibatçı blokada növünü göstərərək WakeLock obyekti yaradır və tapşırıq tamamlandıqdan sonra onu buraxmalıdır, əks halda cihazın batareyası sürətlə boşalacaq. Sistem WakeLock-u avtomatik buraxmır — bu tətbiqin məsuliyyətidir.
Android-in hər əsas versiyası ilə Google WakeLock üzərində nəzarəti gücləndirir. Android 9 (API 28)-dan başlayaraq, fondakı tətbiq ciddi səbəb olmadan WakeLock əldə edə bilməz və sistem blokadalardan sui-istifadə edən tətbiqləri izləyərək məcburi şəkildə onları buraxa bilər. Android 12+-də fon tətbiqləri üçün PowerManager-ə girişə əlavə məhdudiyyətlər tətbiq edilmişdir.
WakeLock, tapşırığın cihazın yuxu rejiminə keçməsi ilə kəsilə bilməyəcəyi ssenarilərdə tələb olunur: qeyri-sabit bağlantı ilə böyük fayl endirmə, video yazma, istifadəçi iştirakı olmadan uzunmüddətli hesablamalar aparma. Yuxu blokadası olmadan prosessor dərin yuxuya keçir, bütün axınlar (threads) dondurulur və tapşırıq yarımçıq qalır.
Bununla belə, Google WakeLock istifadəsini minimuma endirməyi tövsiyə edir. Əksər hallarda eyni tapşırığı Foreground Service bildirişlə, WorkManager və ya JobScheduler ilə həll etmək olar. Bu mexanizmlər batareya və şəbəkə vəziyyətini nəzərə alır ki, bu da cihazın batareya ilə işləmə müddətini uzadır.
WakeLock, cihazın enerji təchizatı vəziyyətini idarə edən PowerManager sistem xidməti vasitəsilə işləyir. Tətbiq powerManager.newWakeLock() vasitəsilə blokada tələb etdikdə, sistem CPU aktivlik səviyyəsini artırır, dərin yuxuya keçidin qarşısını alır. wakeLock.release() çağırıldıqdan sonra sistem normal enerji qənaəti rejiminə qayıdır.
WakeLock-un bütün enerji qənaət rejimlərinin qarşısını almadığını başa düşmək vacibdir. Doze Mode (Android 6+ yuxu rejimi) müəyyən fazalarda WakeLock-a məhəl qoymaya bilər — saxlanılan WakeLock olan tətbiq Doze xidmət pəncərələrində şəbəkəyə çıxış əldə etməyəcək. Bu o deməkdir ki, hətta aktiv WakeLock belə Doze-nin ikinci fazası zamanı şəbəkə əməliyyatlarının icrasına zəmanət vermir.
Hər WakeLock framework tərəfində PowerManager.WakeLock ilə əlaqələndirilir. Sistem proses səviyyəsində aktiv blokadaların sayını aparır: bir proses bir neçə WakeLock saxlayırsa, onlar toplanır və buraxılma yalnız hər blokada üçün release() çağırıldıqdan sonra baş verir. Android həmçinin wake lock timeouts-u dəstəkləyir — müəyyən intervaldan sonra avtomatik buraxılma. Bununla belə, timeout-a etibar etmək tövsiyə edilmir: tapşırıq daha tez bitə bilər və əlavə saxlama müddəti batareya resursunu azaldacaq.
Cihaz yuxu rejiminə keçdikdə (güc düyməsi), Android bütün SCREEN_DIM_WAKE_LOCK və SCREEN_BRIGHT_WAKE_LOCK-u məcburi buraxır, lakin PARTIAL_WAKE_LOCK-u saxlayır. Bu o deməkdir ki, ekran blokadası cihazı ekranı söndürməkdən saxlaya bilməz — yalnız PARTIAL_WAKE_LOCK güc düyməsi basıldıqdan sonra işə davam edə bilər.
Android-də bir neçə WakeLock növü mövcuddur, hər biri cihazın konkret komponentlərini idarə edir. Növün seçimi blokadadan sonra hansı aparat komponentlərinin aktiv qalacağını müəyyən edir. Səhv növ seçimi lazımsız modulların işə salınması səbəbindən həddindən artıq enerji sərfiyyatına gətirib çıxarır.
| Növ | CPU | Ekran | Klaviatura | Nə vaxt istifadə etməli |
|---|---|---|---|---|
| PARTIAL_WAKE_LOCK | Yanır | Sönür | Sönür | Fayl endirmə, hesablamalar |
| SCREEN_DIM_WAKE_LOCK | Yanır | Solğun | Sönür | Video pleyer, təqdimat |
| SCREEN_BRIGHT_WAKE_LOCK | Yanır | Parlaq | Sönür | Oyunlar (köhnəlmiş) |
| FULL_WAKE_LOCK | Yanır | Parlaq | Parlaq | Köhnəlmiş (deprecated) |
PARTIAL_WAKE_LOCK ən çox istifadə olunan və tövsiyə edilən növdür. CPU-nu aktiv vəziyyətdə saxlayır, lakin ekranın və klaviatura işıqlandırmasının sönməsinə imkan verir. Bu fon tapşırıqları üçün optimal seçimdir: məlumat endirmə, şəkil emalı, sinxronizasiya. Ekran sistem vaxt aşımından sonra sönür ki, bu da istifadəçiyə görünməyən işin yerinə yetirilməsi zamanı batareyaya qənaət edir.
SCREEN_DIM_WAKE_LOCK, SCREEN_BRIGHT_WAKE_LOCK və FULL_WAKE_LOCK Android 7-dən (API 24) etibarən köhnəlmiş kimi qeyd olunub. Onlar ekranı yandıq saxlayır ki, bu da əhəmiyyətli batareya sərfiyyatına gətirib çıxarır. Google onların əvəzinə FLAG_KEEP_SCREEN_ON istifadə etməyi tövsiyə edir — bu flag yalnız aktiv Activity zamanı işləyir və WAKE_LOCK icazəsi tələb etmir, sistem isə ekranın saxlanma müddətini avtomatik idarə edir.
WakeLock Android-də batareyanın əsas „yeyicilərindən" biridir. Yuxu blokadasının saxlanılan hər saniyəsi əlavə enerji sərf edir, çünki prosessor enerjiyə qənaət edən C-state vəziyyətinə keçə bilmir. Google Power Dashboard tədqiqatı göstərir ki, səhv buraxılmış WakeLock-ları olan tətbiqlər cihazın enerji sərfiyyatını gözləmə rejimində 30–50% artıra bilər.
Sistem WakeLock-dan sui-istifadə edən tətbiqləri Battery Historian komponenti vasitəsilə izləyir. Tərtibatçı enerji sərfiyyatı profilini təhlil edə və blokada „sızmalarını" — WakeLock-un yaradıldığı, lakin buraxılmadığı vəziyyətləri aşkar edə bilər. Google Play Console dərc edilmiş tətbiqlər üçün WakeLock statistikasını göstərir və uzun saxlama müddəti pis rəylərə səbəb ola bilər.
Doze Mode və App Standby əlavə olaraq WakeLock işini məhdudlaşdırır. Doze-nin birinci fazasında (Light Doze) sistem qısa xidmət pəncərələrində WakeLock-a icazə verir. İkinci fazada (Deep Doze) WakeLock digər blokadalarla birləşdirilir və ümumi pəncərədə icra olunur. Tətbiq istifadəçi qarşılıqlı əlaqəsi olmadan 10 dəqiqədən çox WakeLock saxlayırsa, sistem onu məcburi buraxa və tətbiqi batareya optimallaşdırmasının qara siyahısına sala bilər.
WakeLock-un düzgün istifadəsi tapşırığı yerinə yetirmək zərurəti ilə cihazın batareyasına qayğı arasında tarazlıqdır. Google bir neçə prinsipə riayət etməyi tövsiyə edir: həmişə WakeLock-u finally-də və ya acquire(timeout) vasitəsilə buraxın, minimum zəruri blokada növündən istifadə edin və zəruri olmadan uzun müddət saxlamaqdan çəkinin.
WakeLock yaradıldığı eyni kod blokunda buraxılmalıdır. İstisnalar zamanı buraxılmanı təmin etmək üçün try-finally konstruksiyası və ya Kotlin-in use bloku istifadə olunur. Android 10+-da sistem WakeLock 60 saniyədən çox saxlanıldıqda logcat-da xəbərdarlıq göstərir: "WakeLock held for more than 60 seconds" — bu mümkün sızma siqnalıdır.
acquire(long timeout) metodu WakeLock-u müəyyən edilmiş millisaniyə müddətindən sonra avtomatik buraxır. Bu, buraxma kodunun istisna və ya xəta səbəbindən icra olunmaması halında sığortadır. Tapşırığın maksimum gözlənilən icra müddətinə üstəgəl 10–20% ehtiyat əlavə edərək həmişə timeout göstərmək tövsiyə olunur.
release() çağırmazdan əvvəl WakeLock-un hazırda saxlanılıb-saxlanılmadığını yoxlamaq lazımdır. Əvvəlcədən acquire() olmadan təkrar release() çağırışı RuntimeException: WakeLock under-locked yaradır. Vəziyyət flagını (isHeld) saxlamaq və buraxmazdan əvvəl wakeLock.isHeld() yoxlamaq tövsiyə olunur.
Kotlin-də WakeLock-un düzgün yaradılması və buraxılmasını nəzərdən keçirək. Nümunə PARTIAL_WAKE_LOCK saxlanılması ilə asinxron məlumat endirməni, try-finally blokunda zəmanətli buraxılmanı və sızmalardan qorunmaq üçün timeout göstərilməsini nümayiş etdirir. Xidmət fon tapşırığını icra etmək üçün IO dispetçeri ilə CoroutineScope istifadə edir.
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() {
// Fayl endirmənin simulyasiyası
delay(30000)
}
override fun onDestroy() {
super.onDestroy()
scope.cancel()
if (wakeLock.isHeld()) {
wakeLock.release()
}
}
override fun onBind(intent: Intent): IBinder? = null
}
WakeLock istifadə etmək üçün AndroidManifest.xml-də icazə əlavə etmək lazımdır. WAKE_LOCK icazəsi normal (normal) icazədir — istifadəçidən runtime sorğusu tələb etmir və tətbiq quraşdırılarkən avtomatik verilir. Bununla belə, Google Play tətbiqdə WakeLock istifadəsinin aşkar ssenarisi yoxdursa, dərci rədd edə bilər.
<uses-permission
android:name="android.permission.WAKE_LOCK" />
<uses-permission
android:name="android.permission.DEVICE_POWER" />
WakeLock aşağı səviyyəli mexanizmdir və Google mümkün olduqda onu daha müasir API-lərlə əvəz etməyi tövsiyə edir. Əsas alternativ bildirişli Foreground Service-dir, o, xidmətin işlədiyi müddətdə avtomatik CPU blokadasını saxlayır. Sistem Foreground Service üçün WakeLock-u özü idarə edir, tərtibatçını açıq şəkildə əldə etmə və buraxma zərurətindən azad edir.
WorkManager fon tapşırıqları üçün ikinci ən vacib alətdir. O, cihaz Doze rejiminə keçsə belə və yenidən başladıldıqdan sonra işin icrasına zəmanət verir. WorkManager daxilində blokada saxlama (hold lock) dəstəkləyir — tərtibatçı PowerManager ilə açıq işləməli deyil. Tapşırıq yuxu blokadasının avtomatik idarə edilməsi ilə Doze xidmət pəncərəsində icra olunur.
Dəqiq vaxt tələb edən müntəzəm tapşırıqlar üçün setAndAllowWhileIdle() ilə AlarmManager istifadə olunur, o, cihazı Doze-dən oyada bilər. Lakin AlarmManager yalnız qısa əməliyyatlar üçün uyğundur — uzunmüddətli WakeLock saxlamaq üçün nəzərdə tutulmayıb. Tapşırıq 10 saniyədən çox çəkirsə, AlarmManager-ı Foreground Service işə salan BroadcastReceiver ilə birləşdirmək lazımdır.
Tez-tez verilən suallar
WakeLock, Android cihazının yuxu rejiminə keçməsinin qarşısını alan sistem blokadasıdır. Prosessoru və ya ekranı aktiv vəziyyətdə saxlayır, fon tapşırıqlarının (endirmə, hesablamalar) fasiləsiz icrasına imkan verir. PowerManager sistem xidməti vasitəsilə idarə olunur.
Əsas növlər: PARTIAL_WAKE_LOCK (CPU aktiv, ekran sönük) — tövsiyə olunur; SCREEN_DIM_WAKE_LOCK (CPU + solğun ekran); SCREEN_BRIGHT_WAKE_LOCK (CPU + parlaq ekran). SCREEN_DIM, SCREEN_BRIGHT və FULL_WAKE_LOCK köhnəlmiş kimi qeyd olunub və FLAG_KEEP_SCREEN_ON ilə əvəz edilib.
Bəli, manifestdə android.permission.WAKE_LOCK bəyan edilməlidir. Bu normal icazədir (normal permission) və quraşdırma zamanı avtomatik verilir — runtime-da tələb etmək lazım deyil. Bu icazə olmadan newWakeLock() çağırışı null qaytaracaq və ya SecurityException atacaq.
release() çağırılmasa, cihaz yuxu rejiminə keçə bilməyəcək. Batareya əhəmiyyətli dərəcədə sürətlə boşalacaq (50% əlavə sərfiyyata qədər). Sistem logcat-da sızma qeyd edəcək, Battery Historian isə anormal WakeLock saxlama müddəti göstərəcək ki, bu da istifadəçilərin pis rəylərinə səbəb olacaq.
Uzunmüddətli tapşırıqlar üçün bildirişli Foreground Service istifadə edin — sistem WakeLock-u özü idarə edir. Təxirə salınmış və zəmanətli tapşırıqlar üçün daxili WakeLock dəstəyi olan WorkManager istifadə edin. Qısa cədvəl tapşırıqları üçün — AlarmManager.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun