Тестирование доз и режима ожидания

Я выключил экранное изображение моего устройства Nexus 5 под управлением Android M, а затем выпустил следующие команды.

im17-x0:~ r.j$ adb shell dumpsys battery unplug
im17-x0:~ r.j$ adb shell dumpsys deviceidle step
Stepped to: IDLE_PENDING
im17-x0:~ r.a$ adb shell dumpsys deviceidle step
Stepped to: SENSING
im17-x0:~ r.a$ adb shell dumpsys deviceidle step
Stepped to: IDLE

В идеале мое устройство должно перейти в режим ожидания. Но я начал CountDownTimer перед тем, как поместить его в режим ожидания и все еще работать. Также доступ к сети по-прежнему существует в моем телефоне (проверено с помощью этой функции)

Почему устройство не работает в режиме доз? Следуя опциям здесь в режиме ожидания также имеет тот же эффект. Почему?

Также в этом таймере, если я проверяю isDeviceIdleMode(), он возвращает true.

Ответ 1

На данный момент поведение выглядит так:

  • isDeviceIdleMode() вернет true.
  • Проверка доступности сети в приложении всегда возвращает значение true. (Проверено с помощью этой функции)
  • В сети нет изменений (нет сетевого вещания), когда устройство входит и выходит из режима доз. Однако при включении устройства и выходе из режима доз есть широковещательная передача (доза).
  • Однако мы не можем выполнить сетевой вызов в режиме доз. (Пробовал использовать HttpUrlConnection)

Для getNetworkInfo(), возвращающего true в режиме doze, в Android сообщается об ошибке (Ссылка)

Ответ 2

У меня есть несколько советов для вас здесь:

Доступ к сети

Я бы предложил проверить сетевой доступ, фактически выполнив сетевой вызов и выполнив его регистрацию. Там зарегистрированная ошибка с проверкой сетевого доступа программно в режиме ожидания:
https://code.google.com/p/android-developer-preview/issues/detail?id=3164

Проверка режима ожидания/режима ожидания

Там не так много документации, но есть некоторые методы, которые не отключены режимом Doze. Использование CountDownTimer может быть одним из них. Я попытался бы установить будильник с помощью setExact(), который был задокументирован не работать, когда приложение находится в режиме ожидания. Если вы можете зарегистрировать что-то, когда срабатывает эта тревога, вы определенно не находитесь в режиме ожидания.

Сообщите мне, как это работает для вас!

Ответ 3

Я думаю, что сеть по-прежнему будет возвращаться как подключенная во время доза (если у вас есть сетевое подключение), однако если вы попытаетесь сделать что-либо, кроме GCM, это вызовет ошибку.

Ответ 4

REWRITE:. В моем первоначальном ответе было высказано предположение, что ваше устройство не было в режиме Doze, поэтому ссылка на улучшена инструкция для получения в режим Doze и Дайвинг в Android 'M' Doze о IDLE_MAINTENANCE, где разрешены сетевые действия.

Моя новая гипотеза: (1), когда deviceidle step отвечает Stepped to: IDLE, устройство находится в режиме "Доза", и (2) Режим "Доза" не ведет себя так, как мы ожидаем.

Google обновил страницу Оптимизация для Doze и App Standby, но она не дживется с вашими результатами, Они предоставили дополнительную информацию в Понимание того, что означает режим Doze для вашего приложения и Блок-схема для фоновой работы, аварийных сигналов и вашего приложения для Android. Также см. Проблема 2225.

Я боюсь, что это все еще не объясняет ваши результаты. Режим "Дозировка" сложный и недостаточно документированный.

Q. Ваше приложение включено в белый список? На странице Оптимизация для Doze и App Standby указано:

Приложение, включенное в белый список, может использовать сеть и блокировать частичные блокировки во время Doze и App Standby.

BTW, команда

adb shell dumpsys deviceidle

отображает текущее состояние (например, IDLE) и другую информацию, включая состояние включения/выключения зарядки, движения и экрана, которые являются предпосылками для Dozing, а также белого списка. Это полезно для отладки.

Ответ 5

Вот некоторая полезная информация о режиме ожидания:

deviceidle. Это новая служба Android, которая всегда будет запускать и прослушивать несколько системных событий, которые могут запускать ее в/из режима ожидания (также известный как режим Doze):

1.Screen on/off
2.Charging status
3.Significant motion detect

DeviceIdleController. Когда устройство бодрствует и используется, контроллер находится в состоянии ACTIVE. Внешние события, такие как тайм-аут неактивности, выключение пользователя с экрана, обнаружение движения... приведет к тому, что конечный автомат будет включен в НЕАКТИВНО. Этот конечный автомат содержит семь состояний:

1.ACTIVE - Device is in use, or connected to a charge source.
2.INACTIVE - Device has recently come out of the active state, meaning that user turned off the display or unplugged it.
3.IDLE_PENDING - Hold on, we are about to enter idle mode.
4.SENSING
5.LOCATING
6.IDLE - Device is idle.
7.IDLE_MAINTENANCE - Window is open for applications to do processing. Then will back to IDLE.

Состояние ожидания. Чтобы перевести устройство в состояние ожидания, вы можете использовать следующие команды adb:

>adb shell dumpsys battery unplug
>adb shell dumpsys deviceidle force-idle

Активное состояние. Чтобы вернуть устройство в активное состояние, вы можете имитировать следующее ключевое событие:

> adb shell input keyevent KEYCODE_WAKEUP

Мне также нужна была быстрая опция для переключения между активными и неактивными состояниями, поэтому для этих целей я написал пакет script adbIdleModeSwitch.bat, вы можете скачать и использовать его: https://drive.google.com/file/d/0B81qFnPX_eUUYTMxOTd1UG94NVk/view