Что такое 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'и и пр.
Пример сценария тестирования
- Открыть медиаплеер, включить воспроизведение.
- Погасить экран (не закрывая приложение).
- Убедиться, что музыка продолжает играть.
- Остановить воспроизведение.
- Проверить через
adb shell dumpsys power
— активных wake lock'ов быть не должно.
Обсудить статью, узнать больше можно в телеграм канале «Тестировщики нужны».