Согласно документации Android Marshmallow, когда система находится в режиме доза, любой wakelock игнорируется. Однако мне непонятно, если вакелок предотвратит режим доз или нет.
Режим Wakelock и doze
Ответ 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 был переключен], вам необходимо предпринять соответствующие действия, например, перепланировать вашу работу для следующего окна обслуживания. Из документов:
Одним из непосредственных последствий является то, что система перестанет держать вас в руках.