Использование блокировки пробуждения может ухудшить производительность устройства. Если вам нужно использовать блокировку пробуждения, важно сделать это правильно. В этом документе описаны некоторые рекомендации, которые помогут вам избежать распространенных ошибок блокировки следа.
Правильно назовите блокировку пробуждения
Мы рекомендуем включать имя вашего пакета, класса или метода в тег Wakelock. Таким образом, в случае возникновения ошибки будет проще найти место в исходном коде, где была создана блокировка пробуждения. Вот несколько дополнительных советов:
- Оставьте в имени любую личную информацию (PII), например адрес электронной почты. Если устройство обнаруживает PII в теге блокировки пробуждения, оно регистрирует
_UNKNOWN
вместо указанного вами тега. - Не получайте имя класса или метода программным путем, например, вызывая
getName()
. Если вы попытаетесь получить имя программным путем, оно может быть запутано такими инструментами, как Proguard. Вместо этого используйте жестко запрограммированную строку. - Не добавляйте счетчик или уникальные идентификаторы в теги блокировки пробуждения. Код, создающий блокировку пробуждения, должен использовать один и тот же тег при каждом запуске. Такая практика позволяет системе агрегировать использование блокировки пробуждения каждого метода.
Убедитесь, что ваше приложение видно на переднем плане
Пока активна блокировка пробуждения, устройство потребляет энергию. Пользователь устройства должен знать, что это происходит. По этой причине, если вы используете блокировку пробуждения, вам следует отображать какое-либо уведомление пользователю. На практике это означает, что вам следует получить и удерживать вейклок в приоритетном сервисе . Службы переднего плана необходимы для отображения уведомления.
Если служба переднего плана не является правильным выбором для вашего приложения, вам, вероятно, также не следует использовать блокировку пробуждения. См. документацию «Выберите правильный API, чтобы поддерживать устройство в активном состоянии», чтобы узнать о других способах работы, пока ваше приложение не находится на переднем плане.
Сохраняйте логику простой
Убедитесь, что логика получения и снятия блокировки блокировки максимально проста. Когда ваша логика блокировки пробуждения привязана к сложным конечным автоматам, тайм-аутам, пулам исполнителей или событиям обратного вызова, любая незаметная ошибка в этой логике может привести к тому, что блокировка пробуждения будет удерживаться дольше, чем ожидалось. Эти ошибки трудно диагностировать и отлаживать.
Убедитесь, что блокировка пробуждения всегда отключена.
Если вы используете блокировку пробуждения, вы должны убедиться, что каждая полученная блокировка пробуждения правильно снята. Это не всегда так просто, как кажется. Например, в следующем коде есть проблема:
Котлин
@Throws(MyException::class)
fun doSomethingAndRelease() {
wakeLock.apply {
acquire()
doTheWork() // can potentially throw MyException
release() // does not run if an exception is thrown
}
}
Ява
void doSomethingAndRelease() throws MyException {
wakeLock.acquire();
doTheWork(); // can potentially throw MyException
wakeLock.release(); // does not run if an exception is thrown
}
Проблема здесь в том, что метод doTheWork()
может выдать исключение MyException
. Если это так, метод doSomethingAndRelease()
распространяет исключение наружу и никогда не достигает вызова release()
. В результате блокировка пробуждения срабатывает, но не снимается, что очень плохо.
В исправленном коде doSomethingAndRelease()
обязательно снимает блокировку пробуждения, даже если генерируется исключение:
Котлин
@Throws(MyException::class)
fun doSomethingAndRelease() {
wakeLock.apply {
try {
acquire()
doTheWork()
} finally {
release()
}
}
}
Ява
void doSomethingAndRelease() throws MyException {
try {
wakeLock.acquire();
doTheWork();
} finally {
wakeLock.release();
}
}