Является ли Android Wakelock необходимостью для фоновых служб?

Я пишу долгосрочную фоновую службу, которая собирает и анализирует данные устройства. Для этого я запускаю службу, служба порождает поток, и поток выполняет сбор/анализ данных.

Из моего чтения я узнал, что если я хочу, чтобы служба выполняла свою работу, пока экран заблокирован / устройство спит, я должен использовать частичную блокировку пробуждения, чтобы гарантировать, что процессор не переходит в спящий режим, пока работает поток службы. . Однако я действительно запутался в этом, потому что в настоящее время я не использую wakelock и могу запустить свое приложение в фоновом режиме, заблокировать экран или убить приложение через диспетчер задач, и каждый раз, когда я это делаю, я могу наблюдать через logcat и Утверждения журнала о том, что поток, который я породил в службе, все еще работает и выполняет работу, которую я хочу.

Я даже запустил dumpsys power оболочки adb и обнаружил, что у меня есть refcount = 0 для wakelocks, что указывает мне на то, что другое приложение не удерживает wakelock для меня.

Мне просто повезло, что мой сервис работает нормально в фоновом режиме без wakelock?

Изменить: устройство продемонстрировало такое поведение при подключении к USB и при отключении от USB. Я периодически загружаю данные, которые я собираю, на сервер и запускаю тесты, в которых я никогда не подключаю устройство и блокирую экран на протяжении всего теста, и я все еще вижу, что мой поток работает и данные загружаются.


person neonDion    schedule 04.05.2015    source источник
comment
Вы делаете это с подключенным USB-кабелем?   -  person adjan    schedule 04.05.2015
comment
@ addy2012 Я видел такое поведение при подключении к USB и отключении от USB.   -  person neonDion    schedule 04.05.2015


Ответы (1)


Вам не "повезло", что у вас сервис без вейклока нормально работает. Ваше устройство никогда не спал.

Если у вас подключен USB и подается питание, ваше устройство не будет спать. В конце концов, какой смысл экономить электроэнергию, если у вас есть готовый запас энергии?

Вам нужно подключиться к вашему устройству с помощью adb over IP (adb connect ), а затем выполнить logcat оттуда, чтобы увидеть, соблюдаете ли вы ожидаемые журналы.

РЕДАКТИРОВАТЬ: Забыл ответить на вопрос.

Если вы хотите, чтобы ваш сервис постоянно что-то делал, вам нужно поддерживать блокировку. Имейте в виду, что постоянная блокировка вейклока — это, по сути, грех №1 в мобильном программировании. Вы должны НИКОГДА НЕ СОХРАНЯТЬ ПОСТОЯННУЮ БЛОКИРОВКУ WAKELOCK.

Поскольку ваша служба отслеживает использование данных, вейвлок не нужен, поскольку, если устройство находится в спящем режиме, данные для регистрации отсутствуют.

РЕДАКТИРОВАТЬ 2: Давайте экспериментировать!

Хм. Сон трудно принудить, поэтому давайте сразу перейдем к ядерному варианту.

  1. Измените свой код так, чтобы вместо фактической загрузки данных вы сохраняли некоторые метаданные, чтобы сообщить вам, что вы сохранили бы данные с определенной отметкой времени. Кроме того, измените свой код, чтобы вы могли отслеживать события питания, а также отмечать их временные метки. Если можете, сохраните все эти данные в памяти, чтобы не запускать слишком много системного кода.

  2. Переведите телефон в авиарежим. Правильно, отключите все внешние подключения. Кроме того, не используйте ADB или logcat или что-то в этом роде.

  3. Убейте все ненужные приложения. Удалить лучше всего.

  4. Запустите свою службу, как пользователь, использующий пользовательский интерфейс. НЕ ИСПОЛЬЗУЙТЕ ТЕСТ ЛЮБОГО РОДА; ИСПЫТАНИЯ МОГУТ ПРЕДОТВРАТИТЬ СОН (трудно сказать что-либо наверняка об Android, так как сонливость — это вещь OEM).

  5. Подожди немного.

  6. Выгружайте журналы в памяти с отметками времени. Вы, вероятно, не получите точных данных о том, когда произошел сон, если он даже скажет вам, что вы спали. Но вы должны быть в состоянии сделать вывод об этом из нечетного порядка событий мощности, когда вы возвращаетесь в состояние, в котором вы только что были.

person justhecuke    schedule 04.05.2015
comment
Я отредактировал свой вопрос, чтобы включить дополнительную информацию. Я вижу это поведение независимо от того, подключен ли я к USB. Я проводил тесты в течение всего дня, когда устройство лежало на столе, не было подключено ни к чему с выключенным экраном. Моя фоновая служба запускается и загружает данные, как и ожидалось, пока на устройстве есть батарея. (Но спасибо за подсказку о USB, я не думал, что это может исказить мои результаты). - person neonDion; 04.05.2015
comment
Отредактировал мой ответ экспериментом, который вы можете попробовать. На данный момент это может быть ошибка OEM или что-то, что вы делаете, что мешает системе думать, что она находится в состоянии сна. Сон сложен, потому что почти все я могу спать? входные данные невидимы для пользователя. Кроме очевидных, конечно. - person justhecuke; 05.05.2015
comment
В итоге я провел длительный тест, в котором пытался запустить службу, когда телефон был отключен от сети, а экран заблокирован, и загружать данные каждую минуту. Я обнаружил, что в течение 48 часов устройство иногда вело себя так, как я предполагал (загружать каждую минуту), а иногда оно ждало час перед загрузкой. Это подтвердило, что мне определенно нужен wakelock для достижения стабильной производительности, однако это сбивало с толку, потому что это было не все или ничего, оно было прерывистым и трудно диагностировать, что на самом деле что-то не так. - person neonDion; 05.05.2015
comment
Таково состояние сна андроида :/. Рад видеть, что вы поняли это. - person justhecuke; 06.05.2015