WakeLock: шта је то, врсте и управљање блокадом спавања

Аутор: IT Sectr Објављено: 2026-03-28 Време читања: 9 мин

WakeLock је механизам Android-а који спречава прелазак уређаја у режим спавања, држећи процесор или екран у активном стању. Позадински задаци, као што су преузимање датотека, репродукција звука или снимање података, захтевају WakeLock за гарантовано извршење без прекида. Према спецификацији Android Developers, 2025, неправилна употреба WakeLock-а доводи до брзог пражњења батерије и може бити разлог блокирања апликације у Google Play-у.

Главно

  • WakeLock — блокада спавања, која држи уређај у активном стању
  • Врсте — PARTIAL_WAKE_LOCK, FULL_WAKE_LOCK, SCREEN_DIM_WAKE_LOCK и друге
  • Дозвола — WAKE_LOCK је потребна у манифесту, али се не захтева у runtime-у
  • Ризици — неослобођен WakeLock празни батерију и погоршава корисничко искуство
  • Алтернативе — WorkManager, Foreground Service, JobScheduler смањују потребу за WakeLock-ом

Шта је WakeLock

WakeLock је системска блокада која забрањује Android-у да пребаци уређај у режим смањене потрошње енергије. Обично Android након неколико секунди неактивности корисника гаси екран и пребацује процесор у стање дубоког сна (deep sleep), при чему се позадинске нити заустављају. WakeLock спречава овај прелазак, држећи CPU у активном режиму.

Механизам WakeLock-а се управља путем системског сервиса PowerManager, коме се приступа преко методе getSystemService(Context.POWER_SERVICE). Програмер креира WakeLock објекат наводећи тип блокаде и мора га гарантовано ослободити након завршетка задатка, иначе ће се акумулатор уређаја брзо празнити. Систем не ослобађа WakeLock аутоматски — то је одговорност апликације.

Са сваком главном верзијом Android-а Google пооштрава контролу над WakeLock-ом. Почевши од Android-а 9 (API 28), апликација у позадини не може добити WakeLock без ваљаног разлога, а систем прати апликације које злоупотребљавају блокаде и може их принудно ослободити. У Android-у 12+ уведена су додатна ограничења приступа PowerManager-у за позадинске апликације.

Када је WakeLock потребан

WakeLock је потребан у сценаријима где задатак не може бити прекинут преласком уређаја у сан: преузимање велике датотеке преко нестабилне везе, снимање видеа, извођење дугих прорачуна без учешћа корисника. Без блокаде спавања, процесор прелази у дубок сан, све нити (threads) се замрзавају и задатак остаје незавршен.

Међутим, Google снажно препоручује минимизирање употребе WakeLock-а. У већини случајева исти задатак се може решити помоћу Foreground Service са обавештењем, WorkManager-а или JobScheduler-а. Ови механизми узимају у обзир стање батерије и мреже, што продужава време рада уређаја на батерију.

Како ради WakeLock

WakeLock ради путем системског сервиса PowerManager који управља стањем напајања уређаја. Када апликација затражи блокаду преко powerManager.newWakeLock(), систем подиже ниво активности CPU-а, спречавајући прелазак у дубок сан. Након позива wakeLock.release(), систем се враћа у нормални режим штедње енергије.

Важно је разумети да WakeLock не спречава све режиме штедње енергије. Doze Mode (режим спавања Android 6+) може игнорисати WakeLock у одређеним фазама — апликација са задржаним WakeLock-ом неће имати приступ мрежи у прозорима одржавања Doze-а. То значи да чак ни активан WakeLock не гарантује извршење мрежних операција током друге фазе Doze-а.

Сваки WakeLock је повезан са PowerManager.WakeLock на страни framework-а. Систем води бројање активних блокада на нивоу процеса: ако један процес држи више WakeLock-ова, они се сабирају, а ослобађање се дешава тек након позива release() за сваку блокаду. Android такође подржава wake lock timeouts — аутоматско ослобађање након задатог интервала. Међутим, ослањање на timeout се не препоручује: задатак се може завршити раније, а додатно време задржавања ће смањити век батерије.

WakeLock и системски догађаји

Приликом преласка уређаја у режим спавања (дугме за напајање), Android принудно ослобађа све SCREEN_DIM_WAKE_LOCK и SCREEN_BRIGHT_WAKE_LOCK, али задржава PARTIAL_WAKE_LOCK. То значи да блокада екрана не може спречити уређај да искључи дисплеј — само PARTIAL_WAKE_LOCK може наставити рад након притиска дугмета за напајање.

Врсте WakeLock-а у Android-у

У Android-у постоји неколико врста WakeLock-а, од којих свака управља одређеним компонентама уређаја. Избор врсте одређује које тачно хардверске компоненте остају активне након блокаде. Погрешан избор врсте доводи до прекомерне потрошње енергије због укључивања непотребних модула.

ВрстаCPUЕкранТастатураКада користити
PARTIAL_WAKE_LOCKУкљ.Искљ.Искљ.Преузимање датотека, прорачуни
SCREEN_DIM_WAKE_LOCKУкљ.ПригушенИскљ.Видео плејер, презентација
SCREEN_BRIGHT_WAKE_LOCKУкљ.СветаоИскљ.Игре (застарело)
FULL_WAKE_LOCKУкљ.СветаоСветлаЗастарело (deprecated)

PARTIAL_WAKE_LOCK — главни тип

PARTIAL_WAKE_LOCK је најчешће коришћен и препоручен тип. Држи CPU у активном режиму, али дозвољава екрану и позадинском осветљењу тастатуре да се искључе. Ово је оптималан избор за позадинске задатке: преузимање података, обрада слика, синхронизација. Екран се гаси након системског тајм-аута, што штеди батерију током обављања посла невидљивог кориснику.

Застареле врсте (deprecated)

SCREEN_DIM_WAKE_LOCK, SCREEN_BRIGHT_WAKE_LOCK и FULL_WAKE_LOCK су означене као застареле од Android-а 7 (API 24). Оне држе екран укљученим, што доводи до значајне потрошње батерије. Google препоручује да се уместо њих користи FLAG_KEEP_SCREEN_ON преко Activity.getWindow().addFlags() — ова заставица ради само са активном Activity и не захтева дозволу WAKE_LOCK, а систем аутоматски управља временом задржавања екрана.

WakeLock и потрошња енергије

WakeLock је један од главних „потрошача" батерије на Android-у. Свака секунда задржавања блокаде спавања троши додатну енергију, јер процесор не може прећи у енергетски ефикасно стање C-state. Истраживање Google Power Dashboard-а показује да апликације са неправилно ослобођеним WakeLock-овима могу повећати потрошњу енергије уређаја за 30–50% у режиму чекања.

Систем прати апликације које злоупотребљавају WakeLock путем компоненте Battery Historian. Програмер може анализирати профил потрошње енергије и открити „цурење" блокада — ситуације у којима је WakeLock креиран али није ослобођен. Google Play Console приказује статистику WakeLock-а за објављене апликације, а дуго време задржавања може бити разлог лоших оцена.

Doze Mode и App Standby додатно ограничавају рад WakeLock-а. У првој фази Doze-а (Light Doze) систем дозвољава WakeLock у кратким прозорима одржавања. У другој фази (Deep Doze) WakeLock се обједињује са другим блокадама и извршава се у заједничком прозору. Ако апликација држи WakeLock дуже од 10 минута без корисничке интеракције, систем га може принудно ослободити и ставити апликацију на црну листу оптимизације батерије.

  • Battery Historian — алат за анализу потрошње енергије и цурења WakeLock-а
  • Doze Mode — ограничава WakeLock у прозорима одржавања, обједињујући блокаде
  • Google Play Console — приказује статистику WakeLock-а за објављене апликације
  • Црна листа — апликација може бити означена од стране система као енергетски захтевна

Најбоље праксе коришћења

Правилна употреба WakeLock-а је равнотежа између потребе да се задатак изврши и бриге о батерији уређаја. Google препоручује придржавање неколико принципа: увек ослобађај WakeLock у finally или кроз acquire(timeout), користи минимално потребан тип блокаде и избегавај дуготрајно задржавање без крајње нужде.

Правило ослобађања

WakeLock треба ослободити у истом блоку кода у којем је креиран. За гарантовано ослобађање при изузецима користи се конструкција try-finally или use блок у Kotlin-у. На Android-у 10+ систем приказује упозорење у logcat-у ако је WakeLock задржан дуже од 60 секунди: "WakeLock held for more than 60 seconds" — то је сигнал могућег цурења.

Timeout при преузимању

Метод acquire(long timeout) аутоматски ослобађа WakeLock након задатог времена у милисекундама. Ово је осигурање у случају да се код за ослобађање не изврши због изузетка или грешке. Препоручује се увек навести timeout једнак максималном очекиваном времену извршења задатка плус 10–20% резерве.

Провера постојања блокаде

Пре позива release() треба проверити да ли је WakeLock тренутно задржан. Поновљени позив release() без претходног acquire() изазива RuntimeException: WakeLock under-locked. Препоручује се чување заставице стања (isHeld) и пре ослобађања провера wakeLock.isHeld().

Коришћење WakeLock-а у Kotlin-у

Размотримо правилно креирање и ослобађање WakeLock-а у Kotlin-у. Пример демонстрира асинхроно преузимање података са задржавањем PARTIAL_WAKE_LOCK-а, гарантованим ослобађањем у блоку try-finally и навођењем timeout-а за заштиту од цурења. Сервис користи CoroutineScope са IO диспечером за извршење позадинског задатка.

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() {
        // Симулација преузимања датотеке
        delay(30000)
    }

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

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

Декларација дозволе у манифесту

За коришћење WakeLock-а потребно је додати дозволу у AndroidManifest.xml. Дозвола WAKE_LOCK је нормална (normal) — не захтева runtime захтев од корисника и одобрава се аутоматски приликом инсталације апликације. Ипак, Google Play може одбити објављивање ако апликација нема очигледан сценариј употребе WakeLock-а.

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

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

Алтернативе WakeLock-у

WakeLock је нисконвони механизам и Google препоручује да се, где год је то могуће, замени савременијим API-јима. Главна алтернатива је Foreground Service са обавештењем, који аутоматски држи CPU блокаду током рада сервиса. Систем сам управља WakeLock-ом за Foreground Service, ослобађајући програмера потребе за експлицитним преузимањем и ослобађањем.

WorkManager је други по важности алат за позадинске задатке. Гарантује извршење посла чак и при преласку уређаја у Doze и након поновног покретања. WorkManager подржава држање блокаде (hold lock) унутар себе — програмер не мора експлицитно радити са PowerManager-ом. Задатак се извршава у прозору одржавања Doze-а са аутоматским управљањем блокадом спавања.

За редовне задатке који захтевају прецизно време користи се AlarmManager са setAndAllowWhileIdle(), који може пробудити уређај из Doze-а. Међутим, AlarmManager је погодан само за кратке операције — није намењен за дуготрајно задржавање WakeLock-а. Ако задатак траје дуже од 10 секунди, треба комбиновати AlarmManager са BroadcastReceiver-ом који покреће Foreground Service.

  • Foreground Service — аутоматско управљање WakeLock-ом са обавештењем
  • WorkManager — гарантовано извршење узимајући у обзир Doze и поновно покретање
  • JobScheduler — планирање узимајући у обзир мрежу, пуњење и неактивност
  • AlarmManager — буђење уређаја за кратке задатке по распореду

Често постављана питања

Шта је WakeLock у Android-у?

WakeLock је системска блокада која спречава Android уређај да пређе у режим спавања. Држи процесор или екран у активном стању, омогућавајући позадинским задацима (преузимање, прорачуни) да се извршавају без прекида. Управља се путем системског сервиса PowerManager.

Које врсте WakeLock-а постоје?

Главне врсте: PARTIAL_WAKE_LOCK (CPU активан, екран искључен) — препоручује се; SCREEN_DIM_WAKE_LOCK (CPU + пригушен екран); SCREEN_BRIGHT_WAKE_LOCK (CPU + светао екран). SCREEN_DIM, SCREEN_BRIGHT и FULL_WAKE_LOCK су означени као застарели и замењени са FLAG_KEEP_SCREEN_ON.

Да ли је потребна дозвола за WakeLock?

Да, у манифесту треба декларисати android.permission.WAKE_LOCK. Ово је нормална дозвола (normal permission) која се одобрава аутоматски при инсталацији — не треба је захтевати у runtime-у. Без ове дозволе позив newWakeLock() враћа null или баца SecurityException.

Шта се дешава ако не ослободим WakeLock?

Ако се не позове release(), уређај неће моћи да пређе у режим спавања. Батерија ће се знатно брже празнити (до 50% додатне потрошње). Систем ће забележити цурење у logcat-у, а Battery Historian ће показати аномално време задржавања WakeLock-а, што ће довести до лоших оцена корисника.

Чим заменити WakeLock у модерним апликацијама?

За дуготрајне задатке користите Foreground Service са обавештењем — систем сам управља WakeLock-ом. За одложене и гарантоване задатке користите WorkManager, који подржава WakeLock унутар себе. За кратке задатке по распореду — AlarmManager.

Резиме

  • WakeLock — блокада спавања, која држи CPU или екран Android уређаја у активном стању
  • PARTIAL_WAKE_LOCK — главни тип за позадинске задатке; екран се гаси, CPU остаје активан
  • Дозвола — WAKE_LOCK у манифесту (normal permission, runtime није потребан)
  • Цурење — неослобођен WakeLock празни батерију за 30–50%; ослобађај у finally или кроз timeout
  • Застарело — SCREEN_DIM, SCREEN_BRIGHT и FULL_WAKE_LOCK замењени са FLAG_KEEP_SCREEN_ON
  • Foreground Service — алтернатива са аутоматским управљањем WakeLock-ом и обавештењем
  • WorkManager — најбољи избор за одложене позадинске задатке са гарантованим извршењем

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође