Как я могу сказать, что я пострадал?
Это, наверное, первый вопрос к тем, кто не знаком с этой темой. С Gingerbread (Android 2.3) и выше у вас есть сервис, помогающий вам разобраться: статистика батареи. Хотя производители, как правило, размещают его в разных точках, его можно найти в меню «Настройки» → «О телефоне» и т. Д. И т. Д., И в нем показан список приложений, которые использовали большую часть заряда батареи. Поверх этого небольшой график. Нажмите на него, и вы попадете на экран, похожий на этот:
Скриншот статистики батареи на Android 2.3
Я выбрал скриншот с одного из моих устройств, который иллюстрирует проблему. Если посмотреть на две нижние синие полосы («Aktiv» = устройство не активировано (активно), «Bildschirm an» = «Экран включен»), самая правая синяя полоса на «Aktiv» указывает на WakeLock: устройство было занято, несмотря на тот факт, что экран был выключен. Таким образом, мы можем быть уверены, что у нас есть WakeLock, но мы не можем сказать, кто это вызвал.
Если ваше устройство не предлагает этот экран (или полосы внизу: я только что обнаружил, например, LG Optimus 4X под управлением Android 4.0.3 обрезал эти полосы), вы можете найти их, например, с помощью GSam Battery Monitor :
Аналогичная информация от GSam Battery Monitor - здесь упомянутые «синие полосы» желтого / оранжевого цвета
Что вызвало WakeLock?
К сожалению, на этот вопрос нельзя ответить с помощью предустановленных приложений (за исключением, возможно, некоторых пользовательских ПЗУ). Но есть инструменты, которые могут. Наиболее известным кандидатом для этого является BetterBatteryStats , и он показывает причину в разделе частичных wakelocks :
Скриншоты от BetterBatteryStats
В первом примере 2 (взято со страницы магазина приложений) событие, вызывающее большинство WakeLocks, было желаемым: мы не хотим, чтобы воспроизведение останавливалось во время прослушивания музыки. Итак, второй пример 3 (взятый из реального случая на одном из моих устройств) может оказаться лучше: самые верхние 3 события вызваны тем же приложением, которому необходим WakeLock для поддержания активной службы push-уведомлений IMAP.
В качестве альтернативы BetterBatteryStats , обратите внимание на приложение Wakelock Detector , упомянутое в ответе UzumApps - с которым проще работать, особенно для не техников:
Wakelock Detector - Нажмите на изображение, чтобы увеличить. (Источник: Google Play )
Что может быть сделано?
Если случай такой же ясный, как и во втором примере из предыдущего раздела, действие вполне очевидно - по крайней мере, в моем случае: мне не нужно сразу получать уведомление, когда приходит письмо; задержка в 30 минут абсолютно приемлема. Поэтому я зашел в почтовое приложение, отключил IMAP Push (см. Также: Push Email ) и вместо этого переключился на 30-минутный интервал опроса. WakeLocks не совсем исчезли, но заметно упали - время работы от батареи заметно улучшилось.
Тогда есть случай, упомянутый в самом вопросе: приложение с плохим поведением не выпускает свой WakeLock. Сразитесь с разработчиком своими выводами и попросите исправить. Если он доставляет: проблема решена. Если нет: почти всегда есть альтернативное приложение.
Что делать, если это сама система Android?
Да, иногда это выглядит так: 98% и более потребляются каким-то сервисом Android. О, если это 98%, в большинстве случаев кандидат называется LocationManagerService . Плохой парень шпионит за нами? Не обязательно. В этом особом случае перечисленный «плохой парень» даже не виноват - по крайней мере, не напрямую. Вот еще одно приложение, слишком часто запрашивающее текущее местоположение. На Setera.org есть отличная статья об этом: Определение местоположения Android LocationManagerService для аккумулятора . Чтобы дать реферат: он использует Androiddumpsys
функция (требуется root!) для выгрузки состояния системы и позволяет исследовать прослушиватели, установленные для LocationManagerService. Более внимательный взгляд на их конфигурацию показывает, что они постоянно «забивают» информацию о местоположении (некоторые делают это постоянно, то есть без перерыва). Поскольку идентификатор приложения указан вместе с другим именем приложения в другом месте дампа, вы все равно можете его идентифицировать и предпринять соответствующие действия.
А как насчет НЛО?
К сожалению, есть такие: приложения, которые зарегистрировали WakeLock - и затем вышли, не выпуская его. Осталось: * Неиспользованные F *** ing Obsoletes * - WakeLocks удерживаются без использования. Поэтому нет способа просто вывести приложение на передний план и перенастроить его, или заставить его выпустить свои WakeLocks.
Здесь единственное известное мне решение - это перезагрузка, и я хотел бы найти лучшее решение. Конечно, если вы знаете виновное приложение, шаги, относящиеся к нему, такие же, как и выше: сообщите об этом разработчику, получите исправление - или замените приложение. Но о том, чтобы избавиться от текущего WakeLock? Может быть, кто-то еще может предложить лучшую альтернативу перезагрузке?
Есть ли рекомендуемые дальнейшие чтения?
Конечно. Один сейчас, я могу добавить больше позже:
/sys/power/wake_lock
, но если вы сделали это «правильным» способом, используя PowerManager и PowerManager.WakeLock, сервис будет одновременно удерживать настоящий wakelock. и отпустите его, даже если ваш процесс был убит ...