Какие именно функции перестают работать, если блокировка пробуждения не получена и устройство переходит в спящий режим?

Последние пару дней я пытался выяснить, какие функции в службе (фоновый и передний план) перестают работать, когда устройство засыпает без блокировки пробуждения. Во всей документации только говорится, что блокировка пробуждения «удерживает ЦП от выключения», но каждая протестированная мной функция продолжала работать без блокировки пробуждения, если я выключал экран и отключал устройство. Я также проверил через adb, удерживает ли другое приложение блокировку пробуждения, но количество блокировок пробуждения равно 0.

Я протестировал тяжелые математические вычисления процессора, сетевые запросы и воспроизведение музыки через класс MediaPlayer. Все продолжало работать в фоновом режиме (ниже Oreo) без блокировки пробуждения (сетевой запрос работал на некоторых эмуляторах, а на других нет, но это было одинаково с блокировкой пробуждения и без нее).

Итак, мой вопрос: каковы примеры функций, которые перестают работать на Android, если устройство переходит в спящий режим?

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


person Florian Walther    schedule 15.11.2018    source источник


Ответы (1)


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

Doze предоставляет приложениям периодический период обслуживания для использования сети и обработки ожидающих действий.

А это ограничения:

Ограничения по дремоте Следующие ограничения применяются к вашим приложениям во время

  • Доступ к сети приостановлен.
  • Система игнорирует блокировки пробуждения.
  • Стандартные аварийные сигналы AlarmManager (включая setExact() и setWindow()) откладываются до следующего окна обслуживания.
  • Если вам нужно установить сигналы тревоги, которые срабатывают в режиме ожидания, используйте setAndAllowWhileIdle() или setExactAndAllowWhileIdle().
  • Будильники, установленные с помощью setAlarmClock(), продолжают нормально срабатывать — система выходит из режима ожидания незадолго до срабатывания этих будильников.
  • Система не выполняет сканирование Wi-Fi.
  • Система не позволяет запускать адаптеры синхронизации.
  • Система не разрешает запуск JobScheduler.

Источник: https://developer.android.com/training/monitoring-device-state/doze-standby

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

Используйте это, чтобы включить режим сна

adb shell dumpsys deviceidle force-idle

Отменить это

adb shell dumpsys deviceidle unforce

Сбросить это

adb shell dumpsys battery reset

Дополнительные сведения можно найти здесь: https://developer.android.com/training/monitoring-device-state/doze-standby#testing_doze

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


Насколько я знаю, спящий режим - это режим ожидания. Вы также можете заставить это, используя:

adb shell dumpsys battery unplug
adb shell am set-inactive <packageName> true

и разбуди его

adb shell am set-inactive <packageName> false
adb shell am get-inactive <packageName>

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

person Murat Karagöz    schedule 15.11.2018
comment
Большое спасибо за ответ, но это режим DOZE. Я имею в виду сон, который должен начинаться при выключении экрана. Блокировки пробуждения не зависят от дремоты, потому что дремота игнорирует блокировки пробуждения (как указано в описании). - person Florian Walther; 15.11.2018
comment
@FlorianWalther Спящий режим не запускается сразу после выключения экрана. Секундочку - person Murat Karagöz; 15.11.2018
comment
@FlorianWalther Я уверен, что спящий режим и режим ожидания являются синонимами. Вы можете принудительно перейти в режим ожидания через оболочку adb. - person Murat Karagöz; 15.11.2018
comment
Я тщательно протестировал режим ожидания (экран выключен, питание отключено, разрядка, 0 блокировок пробуждения), но все протестированные функции продолжали работать, как если бы устройство было активным. - person Florian Walther; 15.11.2018
comment
@FlorianWalther Вы пробовали команды оболочки adb? Только так можно убедиться, что вы вошли в нужный режим. - person Murat Karagöz; 15.11.2018
comment
Да я их тестил - person Florian Walther; 15.11.2018
comment
@FlorianWalther Тогда я больше ничего не могу добавить. Может быть специфика производителя. - person Murat Karagöz; 15.11.2018
comment
@FlorianWalther: Я имею в виду сон, который должен начинаться, когда экран выключается - не обязательно. Я также проверил через adb, удерживает ли другое приложение блокировку пробуждения, но счетчик блокировок пробуждения равен 0 — тогда, по определению, ваше устройство подключено через adb и, следовательно, может не перейти в спящий режим. - person CommonsWare; 15.11.2018
comment
Но я могу отправить его в сон через команды adb. По крайней мере, я знаю, что могу перевести устройство в сон (это тоже подразумевает сон?), потому что я вижу, что задания откладываются. Однако, если я сделаю то же самое во время работы службы, это никак не повлияет на службу. - person Florian Walther; 15.11.2018
comment
@CommonsWare Итак, вы бы сказали, что службам обычно требуется блокировка пробуждения, если они должны, когда приложение неактивно? - person Florian Walther; 15.11.2018
comment
@FlorianWalther: Если под неактивным вы подразумеваете отсутствие активности на переднем плане, то вам нужно будет установить блокировку пробуждения, чтобы убедиться, что процессор остается включенным. Режим ожидания / режим ожидания приложения позволяют Android игнорировать эту блокировку, поэтому они вызвали такой ужас. И цель должна заключаться в том, чтобы получить блокировку на как можно более короткое время с максимально возможным контролем со стороны пользователя, поскольку постоянное питание ЦП будет разряжать батарею. - person CommonsWare; 15.11.2018
comment
Хорошо, и то же самое относится к службам переднего плана? Должны ли они держать блокировку пробуждения? - person Florian Walther; 15.11.2018
comment
И, возможно, вы можете взглянуть на этот вопрос (я предполагаю, что вам нравится говорить об услугах, поскольку вы отвечаете на многие из них): stackoverflow.com/questions/53322723/ - person Florian Walther; 15.11.2018
comment
Я использовал приведенные выше команды для входа в режимы doze и appStandBy. Но теперь я не могу вернуть его. Каждый раз, когда экран гаснет, телефон мгновенно переходит в спящий режим. Можешь мне помочь? Я планировал сбросить его до заводских настроек - person sebasira; 12.03.2021