Что такое wake lock в Android

Что такое wake lock в Android

t.me/qa_chillout

Когда вы кладёте телефон на стол, он гасит экран, чтобы не тратить батарейку. Это нормально: если вы ничего не нажимаете, то телефону «нечего делать».

Но бывают ситуации, когда приложению всё равно нужно работать, даже если вы не держите телефон в руках:

  • Музыка продолжает играть — даже когда экран выключен.
  • Идёт загрузка файла — и она не должна остановиться.
  • Навигатор ведёт по маршруту — и не должен «засыпать».

В таких кейсах и необходим Wake Lock — это как «будильник» для телефона.


Wake Lock в Android — это механизм, позволяющий удерживать устройство в активном состоянии, даже если пользователь не взаимодействует с экраном. Он нужен, чтобы предотвратить переход устройства в спящий режим, когда приложению необходимо продолжить работу.


Если злоупотреблять Wake Lock, телефон будет тратить зарядку в пустую. Поэтому:

  • Его нужно включать только тогда, когда это действительно нужно.
  • И обязательно выключать, когда задача завершена.


Пример из жизни

Вы включили музыку и положили телефон в карман. Экран выключился, но музыка не остановилась — потому что приложение удерживает Wake Lock, чтобы телефон не заснул полностью и продолжал проигрывать звук.


Техническая реализация

В Android есть системный компонент — PowerManager. Он управляет питанием устройства: решает, когда можно выключить экран, усыпить процессор или отключить сеть.

Чтобы использовать Wake Lock, приложение обращается к PowerManager через стандартный системный вызов:

val powerManager = getSystemService(Context.POWER_SERVICE) as PowerManager


Далее приложение создаёт объект WakeLock — это как цифровой замок, с которым оно говорит системе: «Не усыпляй устройство — у меня важная задача».

val wakeLock = powerManager.newWakeLock(
  PowerManager.PARTIAL_WAKE_LOCK, 
  "MyApp::MyTag"
)
  • PARTIAL_WAKE_LOCK — тип блокировки (в данном случае, только CPU остаётся активным).
  • "MyApp::MyTag" — тег для отладки и учёта (можно увидеть, кто удерживал Wake Lock).


Чтобы включить блокировку, вызывается метод acquire():

wakeLock.acquire()


Когда задача завершена, приложение обязано отпустить блокировку:

wakeLock.release()

Если этого не сделать, устройство будет расходовать батарею впустую. Поэтому правильная реализация — это всегда acquire() → работа → release().


Для использования Wake Lock в манифесте приложения необходимо также указать разрешение:

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

Без него приложение не сможет создать WakeLock, и будет выброшено исключение.


Как тестировать

1. Когда должен включаться wake lock

  • Приложение включает wake lock только тогда, когда это действительно нужно — например, при воспроизведении музыки, загрузке файлов или работе навигатора.
  • В остальных случаях (например, при открытии обычного экрана) wake lock не должен включаться.

2. Когда должен выключаться wake lock

  • Как только задача завершилась — музыка остановилась, файл загрузился и т.д. — wake lock должен быть отключён.
  • Не должно быть ситуаций, когда он остаётся включённым без причины, и телефон не засыпает.

3. Поведение при выключенном экране

  • Даже если экран погас или телефон заблокирован, важные задачи (музыка, загрузка и т.п.) должны продолжаться.
  • Приложение не должно вылетать или "засыпать" в этот момент.

4. Поведение при прерывании (входящий звонок, смена сети и т.п.)

  • Если во время работы задачи случается что-то внешнее — звонок, пропала сеть и т.п. — wake lock должен вести себя корректно: либо остаться включённым, если задача продолжается, либо отключиться, если задача завершена.


Инструменты

adb shell dumpsys power – Показывает текущее состояние wake lock'ов

adb shell dumpsys battery – Управление питанием устройства для тестов

adb shell dumpsys alarm – Проверка, какие процессы удерживают устройство активным
Android Studio + лог Logcat – Ловим строки acquire() и release()
Battery Historian – Анализирует энергопотребление, wake lock'и и пр.


Пример сценария тестирования

  1. Открыть медиаплеер, включить воспроизведение.
  2. Погасить экран (не закрывая приложение).
  3. Убедиться, что музыка продолжает играть.
  4. Остановить воспроизведение.
  5. Проверить через adb shell dumpsys power — активных wake lock'ов быть не должно.



Обсудить статью, узнать больше можно в телеграм канале «Тестировщики нужны».

Report Page