Подтвердить что ты не робот

Режим Wakelock и doze

Согласно документации Android Marshmallow, когда система находится в режиме доза, любой wakelock игнорируется. Однако мне непонятно, если вакелок предотвратит режим доз или нет.

4b9b3361

Ответ 1

Основываясь на некоторых тестах, используя Nexus 5 с окончательным (?) предварительным просмотром Android 6.0, установленным:

  • Удержание a PARTIAL_WAKE_LOCK недостаточно для блокировки режима Doze — устройство все равно будет дремать, даже если у вас есть WakeLock и вы пытаетесь выполнить обычную работу (например, setExactAndAllowWhileIdle(), чтобы получать контроль каждую минуту)

  • Сохранение экрана при использовании android:keepScreenOn (или эквивалента Java) при включенном экране достаточно для блокировки режима Doze

  • Сохранение экрана при использовании android:keepScreenOn (или эквивалента Java) при выключенном экране (пользователь нажимает кнопку POWER) недостаточно для блокировки режима "Дозировка"

IOW, видеоплееры и т.п. не должны подвергаться воздействию, пока пользователь просматривает видео, даже если игрок не может перемещаться или заряжаться. Однако, если пользователь нажимает кнопку "POWER", вы снова получаете риск Doze.

Я не пробовал использовать FULL_WAKE_LOCK (я ожидал бы, что поведение идентично android:keepScreenOn, но я далек от определенного).

Ответ 2

Интересный

Google собственное приложение часов в Android 6.0 может полностью заблокировать режим Doze:

  • В приложении часов установите будильник со временем < Через 60 минут
  • Выключите устройство
  • В консоли установите $adb shell dumpsys аккумулятор отключить
  • В консоли установите $adb shell dumpsys deviceidle step

Состояние остается следующим: "Stepped to: ACTIVE"

Если вы установите будильник с временем > 60 минут, он работает нормально (устройство может перейти в состояние ожидания). НО после того, как сигнал тревоги < В 60-минутном режиме кажется, что устройство тихо просыпается от Doze бездействия, так как состояние снова возвращает "ACTIVE" (вместо "IDLE_MAINTENANCE" ).

Мне действительно интересно, как они это делают!

- EDIT -

Кажется, что setAlarmClock() имеет такое поведение по умолчанию. Это может быть полезно для некоторых случаев использования.

Ответ 3

В ответ на вышеприведенное обсуждение комментариев это не ответ на вопрос. Это означало прояснить поведение приложения в режиме Doze в целом. В моем тестовом приложении я пытался каждые два минуты получать GPS-позицию, уровень сигнала GPS был достаточным в любое время.

Условия тестирования:

  • Nexus 9, Android M Preview, Build MPA44I
  • "игнорировать оптимизации" ВКЛ
  • setExactAndAllowWhileIdle() с интервалом в 2 минуты
  • каждая операция имеет 1-минутный тайм-аут для получения исправления GPS и окружена частичным wakelock Журналы
  • записывались в SQLiteOpenHelper.getWritableDatabase()

Журнал испытаний GPS для режима Doze:

1   2015-09-04 - 12:14  GPS ok (device left stationary unplugged)
2   2015-09-04 - 12:16  GPS ok
3   2015-09-04 - 12:18  GPS ok
4   2015-09-04 - 12:20  GPS ok
5   2015-09-04 - 12:22  GPS ok
6   2015-09-04 - 12:24  GPS ok
7   2015-09-04 - 12:26  GPS ok
8   2015-09-04 - 12:28  GPS ok
9   2015-09-04 - 12:30  GPS ok
10  2015-09-04 - 12:32  GPS ok
11  2015-09-04 - 12:34  GPS ok
...
31  2015-09-04 - 13:14  GPS ok
32  2015-09-04 - 13:16  GPS ok
33  2015-09-04 - 13:18  GPS ok
34  2015-09-04 - 13:20  GPS ok
35  2015-09-04 - 13:22  GPS ok
36  2015-09-04 - 13:24  GPS ok
37  2015-09-04 - 13:26  GPS ok (entering Doze mode some time after)
38  2015-09-04 - 13:42  GPS failed, active millis: 60174 (idle)
39  2015-09-04 - 13:57  GPS failed, active millis: 60128 (idle)
40  2015-09-04 - 14:12  GPS failed, active millis: 60122 (idle)
41  2015-09-04 - 14:16  GPS ok (idle maintenance)
42  2015-09-04 - 14:18  GPS ok (idle maintenance)
43  2015-09-04 - 14:20  GPS ok (idle maintenance)
44  2015-09-04 - 14:22  GPS ok (idle maintenance)
45  2015-09-04 - 14:38  GPS failed, active millis: 60143 (idle)
46  2015-09-04 - 14:53  GPS failed, active millis: 60122 (idle)
47  2015-09-04 - 15:08  GPS failed, active millis: 60068 (idle)
48  2015-09-04 - 15:23  GPS failed, active millis: 60138 (idle)
49  2015-09-04 - 15:38  GPS failed, active millis: 60140 (idle)
50  2015-09-04 - 15:53  GPS failed, active millis: 60131 (idle)
51  2015-09-04 - 16:08  GPS failed, active millis: 60185 (idle)
52  2015-09-04 - 16:12  GPS ok (ending Doze mode - power button on)

Теперь, когда я снова посмотрел на свои журналы, я заметил очень странное поведение: Тот же тест с выключением "игнорировать оптимизации" показал в основном одинаковые результаты (как и следовало ожидать), но в большинстве случаев тайм-аут не работал должным образом, я получил "активные миллисы" в диапазоне ~ 330000 (~ 5 раз) время) или даже ~ 580000 (~ 10 раз тайм-аут) в режиме ожидания. Это странное поведение, которое я не могу объяснить, но, похоже, показывает, что на самом деле есть некоторый эффект настройки "игнорировать оптимизации" в режиме Doze.

Изменить: Поведение "странное", описанное выше, сейчас задокументировано: только с "игнорированием оптимизации" ON, вы можете провести частичный wakelock в режиме ожидания Doze.

Ответ 4

Насколько я понял, все блокировки бодрствования (за исключением тех, которые хранятся в приложениях с текущим приоритетным сервисом) отбрасываются при запуске более глубокой дозы. Вся доза заключается в том, чтобы позволить системе спать, когда "соответствующие условия" установлены. Таким образом, блокировки не являются чем-то большим, о чем я думаю.

Как я вижу, JobScheduler - это способ планирования планирования, фоновых задач и т.д. в будущем. Тем не менее, он отдает предпочтение разработчикам, но, по-моему, я думаю, что фреймворки решили взять аккумулятор. Это больше похоже на "триггер и надежду, что все будет происходить более или менее вовремя".

Подойдя к вашему прецеденту, JobScheduler имеет onStopJob, чтобы узнать, когда прекращено выполнение вашего задания [по какой-либо причине - скажем, Wi-Fi был переключен], вам необходимо предпринять соответствующие действия, например, перепланировать вашу работу для следующего окна обслуживания. Из документов:

Одним из непосредственных последствий является то, что система перестанет держать вас в руках.