Тестирование доз и режима ожидания
Я выключил экранное изображение моего устройства 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