Android: этапы / уровни сна на устройстве Android?

Есть ли понятие "стадии / уровни сна" на Android?

Просматривая списки рассылки, я осознаю, что существует стадия под названием "Глубокий сон". Останавливается ли выполнение для всех приложений, когда устройство достигает этого состояния? Если да, то, кроме того, что пользователь нажимает кнопку питания, что еще может разбудить устройство?

5 ответов

Решение

Просматривая списки рассылки, я осознаю, что существует стадия под названием "Глубокий сон".

На самом деле не существует отдельной стадии, которая называется "глубокий сон". Есть только "бодрствующий", "спящий" и "выключенный".

Останавливается ли выполнение для всех приложений, когда устройство достигает этого состояния?

Выполнение всех процессов прекращается, когда устройство переходит в спящий режим или выключается.

Если да, то, кроме того, что пользователь нажимает кнопку питания, что еще может разбудить устройство?

  • Сигнал тревоги от AlarmManager
  • Входящий звонок
  • Входящее текстовое сообщение
  • Если у вас открыт сокет для беспроводных данных (не WiFi), входящий пакет на этом сокете

Это большие. Там могут быть другие.

Я заметил следующее поведение:

  1. Вы открыли свою деятельность и перестали с ней взаимодействовать
  2. Через несколько секунд (это зависит от того, как настроено устройство) экран погаснет.

    Когда экран гаснет, onSaveInstance а также onPause называются.

  3. Через несколько секунд (обычно ~15 с) устройство переходит в спящий режим (это правильное имя?)

    Когда это происходит, вызываются следующие методы: onStop (вызов isFinishing возвращает ложь), onRetainNonConfigurationInstance а также onDestroy,

    Все идет нормально. Теперь начинается странное поведение: сразу после последнего onDestroy заканчивается, создается другое действие: onCreate, onStart, onRestoreInstanceState, onResume и наконец onPause вызваны.

    Я не вижу причин для этого странного поведения. Зачем создавать другое действие, чтобы перейти прямо в режим паузы? Это происходит сразу после onDestroy оригинальной деятельности!

Это было проверено на Galaxy S. Я не проверял, что происходит через несколько часов бездействия. Я не уверен, что что-нибудь еще случится.

Я надеюсь, что это поможет вам.

Короткое добавление к списку commonsware. После поиска способа периодически запускать методы, пока телефон спит, я обнаружил, что TimerTask работает в спящем режиме.

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

В Android API 23 был изменен способ работы «сна». Они добавили Doze и App Standby. О них обоих можно прочитать здесь.

Doze: Это будет «сон». Через несколько минут после выключения экрана телефон перейдет в этот режим, отключив все сетевые соединения. Затем через определенные промежутки времени (например, линейная политика отсрочки) приложениям будет «разрешен» доступ к сети в течение ~ 10 секунд. Нет никакого реального способа обойти это, если вы хотите опубликовать свое приложение в Google Play без использования Google FCM. Также стоит отметить, что обновление uptimeMillis во время Doze не гарантируется, потому что ЦП может перейти в режим глубокого сна (elapsedRealtime все равно будет точным).

Ожидание приложения : это по существу остановит ваше приложение, если устройство определит, что приложение «бездействует». Бездействующее приложение — это состояние, определяемое этими факторами.

  • Приложение было запущено пользователем?
  • Приложение запускает службу переднего плана?
  • Приложение сгенерировало уведомление?
  • Является ли приложение активным приложением для администрирования устройства?

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

Бонус: состояния устройств (управляемые DeviceIdleController)

  • АКТИВНЫЙ — используется или подключен к источнику питания.
  • НЕАКТИВНО - Устройство вышло из активного состояния (пользователь выключил экран или отключил его от сети)
  • IDLE_PENDING — собирается перейти в режим ожидания.
  • IDLE — устройство находится в режиме ожидания (в отличие от приложения, помеченного как неактивное из режима ожидания приложения. Это все устройство).
  • IDLE_MAINTENANCE — открыто для обработки приложений (10-секундное окно).

Если вы хотите, чтобы фоновая служба или работник проверяли, находится ли приложение в состоянии IDLE, вы можете использовать функцию isDeviceIdleMode (работает только при входе в Deep Doze, см. ниже).

Пример

      (getSystemService(Context.POWER_SERVICE) as PowerManager).isDeviceIdleMode

Еще некоторые сложности

  1. API 24 добавил больше сложностей в режим Doze (Light Doze и Deep Doze). По сути, это помещает вложенные состояния внутрь состояний устройства.
  2. В API 28 добавлен прогноз «Адаптивная батарея», который использует Doze для перевода в спящий режим пользовательских приложений, которые ОС определяет, что пользователь не будет использовать.
  3. API 28 также добавил «резервные сегменты приложения», чтобы добавить больше состояний в режим ожидания приложения, чем просто бездействие и активность.

Помимо состояний "пробужденный", "спящий" и "выключенный", о которых упоминал @CommonsWare, существует различие между тем, спит ли процессор или просто экраном. Например, официальные документы здесь описывают это так:

Чтобы не разрядить аккумулятор, устройство Android, оставленное бездействующим, быстро засыпает. Тем не менее, бывают случаи, когда приложению необходимо активировать экран или процессор и держать его активным, чтобы выполнить некоторую работу. [выделение добавлено]

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

На этой странице документа также упоминается

Когда устройство Android остается бездействующим, оно сначала тускнеет, затем выключает экран и, в конечном итоге, выключает процессор. Это предотвращает быструю разрядку батареи устройства.

Поэтому, если вы хотите быть всеобъемлющим, вы можете добавить "dim" в список "стадий / уровней сна":

  1. бодрствующий
  2. тусклый
  3. отключения экрана
  4. CPU выключен (истинный "сон" или "глубокий сон")
  5. выключение

По-видимому, переход с 2 на 3 на 4 происходит довольно быстро, когда происходит время простоя. Но бывают и другие моменты, когда экран можно выключить без перехода в глубокий сон; например, при воспроизведении аудио (по крайней мере, в некоторых приложениях).

Хотел бы я рассказать вам, как предсказать, когда устройство перейдет из выключенного экрана в выключенное ЦП - например, как долго истекает время ожидания - но я не нашел эту информацию. Я обнаружил FLAG_KEEP_SCREEN_ON и WAKE_LOCK, чтобы не допустить того или другого.

PS Если вы хотите быть исчерпывающим, вы можете посчитать мечту в своем списке "стадий сна":

Daydream - это новый [с Android 4.2] интерактивный режим заставки для устройств Android. Он активируется автоматически, когда устройство вставлено в док-станцию ​​или когда устройство не используется, когда он подключен к зарядному устройству (вместо того, чтобы выключать экран).

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

Другие вопросы по тегам