WakeLock је механизам Android-а који спречава прелазак уређаја у режим спавања, држећи процесор или екран у активном стању. Позадински задаци, као што су преузимање датотека, репродукција звука или снимање података, захтевају WakeLock за гарантовано извршење без прекида. Према спецификацији Android Developers, 2025, неправилна употреба WakeLock-а доводи до брзог пражњења батерије и може бити разлог блокирања апликације у Google Play-у.
Главно
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 је потребан у сценаријима где задатак не може бити прекинут преласком уређаја у сан: преузимање велике датотеке преко нестабилне везе, снимање видеа, извођење дугих прорачуна без учешћа корисника. Без блокаде спавања, процесор прелази у дубок сан, све нити (threads) се замрзавају и задатак остаје незавршен.
Међутим, Google снажно препоручује минимизирање употребе WakeLock-а. У већини случајева исти задатак се може решити помоћу Foreground Service са обавештењем, WorkManager-а или JobScheduler-а. Ови механизми узимају у обзир стање батерије и мреже, што продужава време рада уређаја на батерију.
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 се не препоручује: задатак се може завршити раније, а додатно време задржавања ће смањити век батерије.
Приликом преласка уређаја у режим спавања (дугме за напајање), Android принудно ослобађа све SCREEN_DIM_WAKE_LOCK и SCREEN_BRIGHT_WAKE_LOCK, али задржава PARTIAL_WAKE_LOCK. То значи да блокада екрана не може спречити уређај да искључи дисплеј — само PARTIAL_WAKE_LOCK може наставити рад након притиска дугмета за напајање.
У Android-у постоји неколико врста WakeLock-а, од којих свака управља одређеним компонентама уређаја. Избор врсте одређује које тачно хардверске компоненте остају активне након блокаде. Погрешан избор врсте доводи до прекомерне потрошње енергије због укључивања непотребних модула.
| Врста | CPU | Екран | Тастатура | Када користити |
|---|---|---|---|---|
| PARTIAL_WAKE_LOCK | Укљ. | Искљ. | Искљ. | Преузимање датотека, прорачуни |
| SCREEN_DIM_WAKE_LOCK | Укљ. | Пригушен | Искљ. | Видео плејер, презентација |
| SCREEN_BRIGHT_WAKE_LOCK | Укљ. | Светао | Искљ. | Игре (застарело) |
| FULL_WAKE_LOCK | Укљ. | Светао | Светла | Застарело (deprecated) |
PARTIAL_WAKE_LOCK је најчешће коришћен и препоручен тип. Држи CPU у активном режиму, али дозвољава екрану и позадинском осветљењу тастатуре да се искључе. Ово је оптималан избор за позадинске задатке: преузимање података, обрада слика, синхронизација. Екран се гаси након системског тајм-аута, што штеди батерију током обављања посла невидљивог кориснику.
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 је један од главних „потрошача" батерије на 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 минута без корисничке интеракције, систем га може принудно ослободити и ставити апликацију на црну листу оптимизације батерије.
Правилна употреба WakeLock-а је равнотежа између потребе да се задатак изврши и бриге о батерији уређаја. Google препоручује придржавање неколико принципа: увек ослобађај WakeLock у finally или кроз acquire(timeout), користи минимално потребан тип блокаде и избегавај дуготрајно задржавање без крајње нужде.
WakeLock треба ослободити у истом блоку кода у којем је креиран. За гарантовано ослобађање при изузецима користи се конструкција try-finally или use блок у Kotlin-у. На Android-у 10+ систем приказује упозорење у logcat-у ако је WakeLock задржан дуже од 60 секунди: "WakeLock held for more than 60 seconds" — то је сигнал могућег цурења.
Метод acquire(long timeout) аутоматски ослобађа WakeLock након задатог времена у милисекундама. Ово је осигурање у случају да се код за ослобађање не изврши због изузетка или грешке. Препоручује се увек навести timeout једнак максималном очекиваном времену извршења задатка плус 10–20% резерве.
Пре позива release() треба проверити да ли је WakeLock тренутно задржан. Поновљени позив release() без претходног acquire() изазива RuntimeException: WakeLock under-locked. Препоручује се чување заставице стања (isHeld) и пре ослобађања провера wakeLock.isHeld().
Размотримо правилно креирање и ослобађање WakeLock-а у Kotlin-у. Пример демонстрира асинхроно преузимање података са задржавањем PARTIAL_WAKE_LOCK-а, гарантованим ослобађањем у блоку try-finally и навођењем timeout-а за заштиту од цурења. Сервис користи CoroutineScope са IO диспечером за извршење позадинског задатка.
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-а.
<uses-permission
android:name="android.permission.WAKE_LOCK" />
<uses-permission
android:name="android.permission.DEVICE_POWER" />
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.
Често постављана питања
WakeLock је системска блокада која спречава Android уређај да пређе у режим спавања. Држи процесор или екран у активном стању, омогућавајући позадинским задацима (преузимање, прорачуни) да се извршавају без прекида. Управља се путем системског сервиса PowerManager.
Главне врсте: 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.
Да, у манифесту треба декларисати android.permission.WAKE_LOCK. Ово је нормална дозвола (normal permission) која се одобрава аутоматски при инсталацији — не треба је захтевати у runtime-у. Без ове дозволе позив newWakeLock() враћа null или баца SecurityException.
Ако се не позове release(), уређај неће моћи да пређе у режим спавања. Батерија ће се знатно брже празнити (до 50% додатне потрошње). Систем ће забележити цурење у logcat-у, а Battery Historian ће показати аномално време задржавања WakeLock-а, што ће довести до лоших оцена корисника.
За дуготрајне задатке користите Foreground Service са обавештењем — систем сам управља WakeLock-ом. За одложене и гарантоване задатке користите WorkManager, који подржава WakeLock унутар себе. За кратке задатке по распореду — AlarmManager.
Резиме
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође