WakeLock: bu nima, uyqu blokirovkasi turlari va boshqaruvi

Muallif: IT Sectr Nashr etilgan: 2026-03-28 O'qish vaqti: 9 daq

WakeLock — bu Android-ning qurilmani uyqu rejimiga o'tkazishni oldini oluvchi, protsessor yoki ekranni faol holatda ushlab turuvchi mexanizmdir. Fayllarni yuklash, audio tinglash yoki ma'lumotlarni yozish kabi fon vazifalari uzluksiz bajarilishi uchun WakeLock talab qiladi. Android Developers, 2025 spetsifikatsiyasiga ko'ra, WakeLock-dan noto'g'ri foydalanish batareyaning tez zaryadsizlanishiga olib keladi va Google Play-da ilovaning bloklanishiga sabab bo'lishi mumkin.

Asosiy ma'lumotlar

  • WakeLock — qurilmani faol holatda ushlab turuvchi uyqu blokirovkasi
  • Turlari — PARTIAL_WAKE_LOCK, FULL_WAKE_LOCK, SCREEN_DIM_WAKE_LOCK va boshqalar
  • Ruxsat — WAKE_LOCK manifestda talab qilinadi, lekin runtime-da so'ralmaydi
  • Xatarlar — yopilmagan WakeLock batareyani zaryadsizlantiradi va foydalanuvchi tajribasini yomonlashtiradi
  • Alternativlar — WorkManager, Foreground Service, JobScheduler WakeLock-ga bo'lgan ehtiyojni kamaytiradi

WakeLock nima

WakeLock — bu Android-ga qurilmani kam energiya sarfi rejimiga o'tkazishni taqiqlovchi tizim blokirovkasi. Odatda Android foydalanuvchining bir necha soniya harakatsizligidan so'ng ekranni o'chiradi va protsessorni chuqur uyqu (deep sleep) holatiga o'tkazadi, bunda fon oqimlari to'xtatiladi. WakeLock bu o'tishni oldini oladi, CPU-ni faol rejimda ushlab turadi.

WakeLock mexanizmi PowerManager tizim xizmati orqali boshqariladi, unga getSystemService(Context.POWER_SERVICE) metodi orqali kirish mumkin. Dasturchi blokirovka turini ko'rsatib, WakeLock obyektini yaratadi va vazifa tugagandan so'ng uni bo'shatishi kerak, aks holda qurilma batareyasi tez zaryadsizlanadi. Tizim WakeLock-ni avtomatik bo'shatmaydi — bu ilovaning mas'uliyati.

Android-ning har bir asosiy versiyasi bilan Google WakeLock ustidan nazoratni kuchaytiradi. Android 9 (API 28)-dan boshlab, fondagi ilova jiddiy sababsiz WakeLock ololmaydi va tizim blokirovkalardan suiiste'mol qiluvchi ilovalarni kuzatib, ularni majburiy bo'shatishi mumkin. Android 12+ da fon ilovalari uchun PowerManager-ga kirishga qo'shimcha cheklovlar joriy qilingan.

WakeLock qachon kerak

WakeLock vazifani qurilmaning uyqu rejimiga o'tishi bilan to'xtatib bo'lmaydigan stsenariylarda talab qilinadi: beqaror ulanish orqali katta fayl yuklash, video yozish, foydalanuvchi ishtirokisiz uzoq muddatli hisob-kitoblarni bajarish. Uyqu blokirovkasisiz protsessor chuqur uyquga ketadi, barcha oqimlar (threads) muzlatiladi va vazifa tugallanmay qoladi.

Biroq, Google WakeLock dan foydalanishni minimallashtirishni qat'iy tavsiya qiladi. Aksariyat hollarda bir xil vazifani Foreground Service bildirishnoma bilan, WorkManager yoki JobScheduler yordamida hal qilish mumkin. Bu mexanizmlar batareya va tarmoq holatini hisobga oladi, bu esa qurilmaning batareyada ishlash vaqtini uzaytiradi.

WakeLock qanday ishlaydi

WakeLock qurilmaning quvvat holatini boshqaruvchi PowerManager tizim xizmati orqali ishlaydi. Ilova powerManager.newWakeLock() orqali blokirovka so'raganda, tizim CPU faollik darajasini oshiradi, chuqur uyquga o'tishni oldini oladi. wakeLock.release() chaqirilgandan so'ng, tizim normal energiya tejash rejimiga qaytadi.

WakeLock barcha energiya tejash rejimlarini oldini olmasligini tushunish muhimdir. Doze Mode (Android 6+ uyqu rejimi) ma'lum fazalarda WakeLock-ni e'tiborsiz qoldirishi mumkin — ushlab turilgan WakeLock-ga ega ilova Doze xizmat oynalarida tarmoqqa kira olmaydi. Bu shuni anglatadiki, hatto faol WakeLock ham Doze-ning ikkinchi fazasida tarmoq operatsiyalarining bajarilishini kafolatlamaydi.

Har bir WakeLock framework tomonida PowerManager.WakeLock bilan bog'langan. Tizim jarayon darajasida faol blokirovkalar hisobini yuritadi: agar bitta jaroyon bir nechta WakeLock-ni ushlab tursa, ular yig'iladi va bo'shatish faqat har bir blokirovka uchun release() chaqirilgandan so'ng amalga oshiriladi. Android shuningdek wake lock timeouts-ni qo'llab-quvvatlaydi — belgilangan intervaldan so'ng avtomatik bo'shatish. Biroq, timeout-ga tayanish tavsiya etilmaydi: vazifa ertaroq tugashi mumkin va qo'shimcha ushlab turish vaqti batareya resursini kamaytiradi.

WakeLock va tizim hodisalari

Qurilma uyqu rejimiga o'tganda (quvvat tugmasi), Android barcha SCREEN_DIM_WAKE_LOCK va SCREEN_BRIGHT_WAKE_LOCK-ni majburiy bo'shatadi, lekin PARTIAL_WAKE_LOCK-ni saqlab qoladi. Bu shuni anglatadiki, ekran blokirovkasi qurilmani displeyni o'chirishdan ushlab turolmaydi — faqat PARTIAL_WAKE_LOCK quvvat tugmasi bosilgandan so'ng ishlashni davom ettirishi mumkin.

Android-da WakeLock turlari

Android-da bir nechta WakeLock turlari mavjud, ularning har biri qurilmaning muayyan komponentlarini boshqaradi. Turini tanlash blokirovkadan so'ng qaysi apparat komponentlari faol qolishini belgilaydi. Noto'g'ri turni tanlash keraksiz modullarning yoqilishi sababli ortiqcha energiya sarfiga olib keladi.

TurCPUEkranKlaviaturaQachon ishlatish
PARTIAL_WAKE_LOCKYoq.O'ch.O'ch.Fayl yuklash, hisob-kitoblar
SCREEN_DIM_WAKE_LOCKYoq.XiraO'ch.Video pleyer, taqdimot
SCREEN_BRIGHT_WAKE_LOCKYoq.YorqinO'ch.O'yinlar (eskirgan)
FULL_WAKE_LOCKYoq.YorqinYorqinEskirgan (deprecated)

PARTIAL_WAKE_LOCK — asosiy tur

PARTIAL_WAKE_LOCK eng ko'p ishlatiladigan va tavsiya etilgan turdir. CPU-ni faol rejimda ushlab turadi, lekin ekran va klaviatura yoritilishining o'chishiga imkon beradi. Bu fon vazifalari uchun eng maqbul tanlovdir: ma'lumot yuklash, tasvirni qayta ishlash, sinxronizatsiya. Ekran tizim vaqt chegarasidan so'ng o'chadi, bu esa foydalanuvchiga ko'rinmaydigan ishni bajarishda batareyani tejaydi.

Eskirgan turlar (deprecated)

SCREEN_DIM_WAKE_LOCK, SCREEN_BRIGHT_WAKE_LOCK va FULL_WAKE_LOCK Android 7 (API 24) dan boshlab eskirgan deb belgilangan. Ular ekranni yoqilgan holda ushlab turadi, bu esa sezilarli batareya sarfiga olib keladi. Google ularning o'rniga FLAG_KEEP_SCREEN_ON dan foydalanishni tavsiya qiladi — bu bayroq faqat faol Activity bilan ishlaydi va WAKE_LOCK ruxsatini talab qilmaydi, tizim esa ekranni ushlab turish vaqtini avtomatik boshqaradi.

WakeLock va energiya sarfi

WakeLock Android-da batareyaning asosiy „iste'molchilaridan" biridir. Uyqu blokirovkasining har bir soniyasi qo'shimcha energiya sarflaydi, chunki protsessor energiya tejovchi C-state holatiga o'ta olmaydi. Google Power Dashboard tadqiqoti shuni ko'rsatadiki, noto'g'ri bo'shatilgan WakeLock-larga ega ilovalar qurilmaning energiya sarfini kutish rejimida 30–50% ga oshirishi mumkin.

Tizim WakeLock-dan suiiste'mol qiluvchi ilovalarni Battery Historian komponenti orqali kuzatadi. Dasturchi energiya sarfi profilini tahlil qilishi va blokirovka „oqishlarini" — WakeLock yaratilgan, ammo bo'shatilmagan holatlarni aniqlashi mumkin. Google Play Console nashr etilgan ilovalar uchun WakeLock statistikasini ko'rsatadi va uzoq ushlab turish vaqti yomon baholarga sabab bo'lishi mumkin.

Doze Mode va App Standby qo'shimcha ravishda WakeLock ishini cheklaydi. Doze-ning birinchi fazasida (Light Doze) tizim qisqa xizmat oynalarida WakeLock-ga ruxsat beradi. Ikkinchi fazada (Deep Doze) WakeLock boshqa blokirovkalar bilan birlashtiriladi va umumiy oynada bajariladi. Agar ilova foydalanuvchi bilan o'zaro aloqasiz 10 daqiqadan ko'proq WakeLock-ni ushlab tursa, tizim uni majburiy bo'shatishi va ilovani batareya optimallashtirishning qora ro'yxatiga kiritishi mumkin.

  • Battery Historian — energiya sarfi va WakeLock oqishlarini tahlil qilish vositasi
  • Doze Mode — blokirovkalarni birlashtirib, xizmat oynalarida WakeLock-ni cheklaydi
  • Google Play Console — nashr etilgan ilovalar uchun WakeLock statistikasini ko'rsatadi
  • Qora ro'yxat — ilova tizim tomonidan energiya talabchan deb belgilanishi mumkin

Foydalanish bo'yicha eng yaxshi amaliyotlar

WakeLock-dan to'g'ri foydalanish vazifani bajarish zaruriyati bilan qurilma batareyasiga g'amxo'rlik o'rtasidagi muvozanatdir. Google bir necha tamoyillarga rioya qilishni tavsiya qiladi: har doim WakeLock-ni finally-da yoki acquire(timeout) orqali bo'shating, minimal zarur blokirovka turidan foydalaning va zaruriyatsiz uzoq muddat ushlab turishdan saqlaning.

Bo'shatish qoidasi

WakeLock yaratilgan kod blokining o'zida bo'shatilishi kerak. Istisnolar paytida bo'shatishni kafolatlash uchun try-finally konstruksiyasi yoki Kotlin-ning use bloki ishlatiladi. Android 10+ da tizim WakeLock 60 soniyadan ko'proq ushlab turilsa, logcat-da ogohlantirish chiqaradi: "WakeLock held for more than 60 seconds" — bu mumkin bo'lgan oqish signalidir.

Timeout bilan olish

acquire(long timeout) metodi WakeLock-ni belgilangan millisoniya vaqtdan so'ng avtomatik bo'shatadi. Bu bo'shatish kodi istisno yoki xato tufayli bajarilmasa, sug'urta vazifasini o'taydi. Vazifaning maksimal kutilgan bajarilish vaqtiga qo'shimcha 10–20% zaxira qo'shib, har doim timeout ko'rsatish tavsiya etiladi.

Blokirovka mavjudligini tekshirish

release() chaqirishdan oldin WakeLock hozirda ushlab turilganligini tekshirish kerak. Oldingi acquire() holda takroriy release() chaqiruvi RuntimeException: WakeLock under-locked keltirib chiqaradi. Holat bayrog'ini (isHeld) saqlash va bo'shatishdan oldin wakeLock.isHeld() tekshirish tavsiya etiladi.

Kotlin-da WakeLock dan foydalanish

Kotlin-da WakeLock-ni to'g'ri yaratish va bo'shatishni ko'rib chiqamiz. Misol PARTIAL_WAKE_LOCK ushlab turish bilan asinxron ma'lumot yuklashni, try-finally blokida kafolatlangan bo'shatishni va oqishlardan himoya qilish uchun timeout ko'rsatishni namoyish etadi. Xizmat fon vazifasini bajarish uchun IO dispetcheri bilan CoroutineScope dan foydalanadi.

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() {
        // Fayl yuklash simulyatsiyasi
        delay(30000)
    }

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

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

Manifestda ruxsatni e'lon qilish

WakeLock dan foydalanish uchun AndroidManifest.xml-ga ruxsat qo'shish kerak. WAKE_LOCK ruxsati oddiy (normal) ruxsatdir — u foydalanuvchidan runtime so'rovini talab qilmaydi va ilova o'rnatilganda avtomatik beriladi. Shunga qaramay, Google Play ilovada WakeLock dan foydalanishning aniq stsenariysi bo'lmasa, nashrni rad etishi mumkin.

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

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

WakeLock-ga alternativlar

WakeLock past darajali mexanizm bo'lib, Google imkon qadar uni zamonaviyroq API-lar bilan almashtirishni tavsiya qiladi. Asosiy alternativ bildirishnoma bilan Foreground Service dir, u xizmat ishlayotgan vaqt davomida avtomatik CPU blokirovkasini ushlab turadi. Tizim Foreground Service uchun WakeLock-ni o'zi boshqaradi, dasturchini aniq olish va bo'shatish zaruratidan ozod qiladi.

WorkManager fon vazifalari uchun ikkinchi muhim vositadir. U qurilma Doze rejimiga o'tganda ham va qayta ishga tushgandan so'ng ham ishning bajarilishini kafolatlaydi. WorkManager ichki blokirovka ushlab turish (hold lock) ni qo'llab-quvvatlaydi — dasturchi PowerManager bilan ochiq ishlashi shart emas. Vazifa uyqu blokirovkasini avtomatik boshqarish bilan Doze xizmat oynasida bajariladi.

Aniq vaqt talab qiladigan muntazam vazifalar uchun setAndAllowWhileIdle() bilan AlarmManager ishlatiladi, u qurilmani Doze-dan uyg'otishi mumkin. Biroq AlarmManager faqat qisqa operatsiyalar uchun mos keladi — u uzoq muddatli WakeLock ushlab turish uchun mo'ljallanmagan. Agar vazifa 10 soniyadan ko'proq davom etsa, AlarmManager-ni Foreground Service ni ishga tushiruvchi BroadcastReceiver bilan birlashtirish kerak.

  • Foreground Service — bildirishnoma bilan WakeLock-ni avtomatik boshqarish
  • WorkManager — Doze va qayta ishga tushirishni hisobga olgan holda kafolatlangan bajarish
  • JobScheduler — tarmoq, quvvatlash va bo'sh vaqtni hisobga olgan holda rejalashtirish
  • AlarmManager — qisqa vazifalar uchun qurilmani uyg'otish

Tez-tez so'raladigan savollar

Android-da WakeLock nima?

WakeLock — bu Android qurilmasining uyqu rejimiga o'tishini oldini oluvchi tizim blokirovkasi. Protsessor yoki ekranni faol holatda ushlab turadi, fon vazifalariga (yuklash, hisob-kitoblar) uzluksiz bajarilishiga imkon beradi. PowerManager tizim xizmati orqali boshqariladi.

WakeLock-ning qanday turlari mavjud?

Asosiy turlari: PARTIAL_WAKE_LOCK (CPU faol, ekran o'chiq) — tavsiya etiladi; SCREEN_DIM_WAKE_LOCK (CPU + xira ekran); SCREEN_BRIGHT_WAKE_LOCK (CPU + yorqin ekran). SCREEN_DIM, SCREEN_BRIGHT va FULL_WAKE_LOCK eskirgan deb belgilangan va FLAG_KEEP_SCREEN_ON bilan almashtirilgan.

WakeLock uchun ruxsat kerakmi?

Ha, manifestda android.permission.WAKE_LOCK e'lon qilinishi kerak. Bu oddiy ruxsat (normal permission) bo'lib, o'rnatish vaqtida avtomatik beriladi — runtime-da so'rash shart emas. Bu ruxsatsiz newWakeLock() chaqiruvi null qaytaradi yoki SecurityException tashlaydi.

WakeLock bo'shatilmasa nima bo'ladi?

Agar release() chaqirilmasa, qurilma uyqu rejimiga o'ta olmaydi. Batareya sezilarli darajada tezroq zaryadsizlanadi (50% qo'shimcha sarfgacha). Tizim logcat-da oqishni qayd etadi, Battery Historian esa anormal WakeLock ushlab turish vaqtini ko'rsatadi, bu foydalanuvchilarning yomon baholariga olib keladi.

Zamonaviy ilovalarda WakeLock-ni nima bilan almashtirish mumkin?

Uzoq muddatli vazifalar uchun bildirishnoma bilan Foreground Service dan foydalaning — tizim WakeLock-ni o'zi boshqaradi. Kechiktirilgan va kafolatlangan vazifalar uchun ichki WakeLock qo'llab-quvvatlovchi WorkManager dan foydalaning. Qisqa jadval vazifalari uchun — AlarmManager.

Xulosa

  • WakeLock — Android qurilmasining CPU yoki ekranini faol holatda ushlab turuvchi uyqu blokirovkasi
  • PARTIAL_WAKE_LOCK — fon vazifalari uchun asosiy tur; ekran o'chadi, CPU faol qoladi
  • Ruxsat — manifestda WAKE_LOCK (normal permission, runtime talab qilinmaydi)
  • Oqishlar — yopilmagan WakeLock batareyani 30–50% zaryadsizlantiradi; finally yoki timeout bilan bo'shating
  • Eskirgan — SCREEN_DIM, SCREEN_BRIGHT va FULL_WAKE_LOCK FLAG_KEEP_SCREEN_ON bilan almashtirilgan
  • Foreground Service — bildirishnoma bilan WakeLock-ni avtomatik boshqarishga alternativ
  • WorkManager — kafolatlangan bajarish bilan kechiktirilgan fon vazifalari uchun eng yaxshi tanlov

Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz

IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.

Loyihani muhokama qilish

Shuningdek o'qing