Оптимизация для режима сна и режима ожидания приложения

В Android есть две функции энергосбережения, которые продлевают срок службы батареи для пользователей, управляя поведением приложений, когда устройство не подключено к источнику питания: Doze и App Standby. Doze снижает расход заряда батареи, откладывая фоновую активность ЦП и сети для приложений, когда устройство не используется в течение длительного периода времени. Режим ожидания приложений откладывает фоновую сетевую активность для приложений, в которых в последнее время не было активности пользователей.

Пока устройство находится в режиме ожидания, доступ приложений к определенным ресурсам, потребляющим много энергии, откладывается до периода обслуживания. Конкретные ограничения перечислены в разделе «Ограничения управления питанием» .

Режимы Doze и App Standby управляют поведением всех приложений, работающих на Android 6.0 или более поздней версии, независимо от того, ориентированы ли они конкретно на уровень API 23. Чтобы обеспечить максимальное удобство для пользователей, протестируйте свое приложение в режимах Doze и App Standby и выполните все необходимые действия. корректировки вашего кода. В следующих разделах представлены подробности.

Поймите дозу

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

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

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

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

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

Ограничения дозы

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

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

Контрольный список дозы

Адаптируйте свое приложение к Doze

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

Чтобы помочь с планированием сигналов тревоги, вы можете использовать два метода AlarmManager : setAndAllowWhileIdle() и setExactAndAllowWhileIdle() . С помощью этих методов вы можете установить будильники, которые сработают, даже если устройство находится в режиме сна.

Ограничение Doze на доступ к сети также может повлиять на ваше приложение, особенно если приложение использует сообщения в реальном времени, такие как щекотки или уведомления. Если вашему приложению требуется постоянное подключение к сети для получения сообщений, по возможности используйте Firebase Cloud Messaging (FCM) .

Чтобы убедиться, что ваше приложение с Doze ведет себя должным образом, вы можете использовать команды adb , чтобы заставить систему входить в Doze и выходить из него, а также наблюдать за поведением вашего приложения. Подробности см. в разделе Тестирование с использованием Doze и App Standby .

Понимание режима ожидания приложения

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

  • Пользователь явно запускает приложение.
  • В приложении есть процесс, который в данный момент находится на переднем плане: либо в виде действия или службы переднего плана, либо используется другим действием или службой переднего плана.
  • Приложение генерирует уведомление, которое пользователи видят на экране блокировки или в области уведомлений.

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

Используйте FCM для взаимодействия с вашим приложением, пока устройство находится в режиме ожидания.

Firebase Cloud Messaging (FCM) — это служба «облако-устройство», которая позволяет поддерживать нисходящий обмен сообщениями в реальном времени между серверными службами и приложениями на устройствах Android. FCM обеспечивает единое постоянное соединение с облаком. Все приложения, которым требуется обмен сообщениями в режиме реального времени, могут использовать это соединение. Это общее соединение значительно оптимизирует расход заряда батареи, избавляя несколько приложений от необходимости поддерживать свои собственные отдельные постоянные соединения, что может быстро разряжать батарею. По этой причине, если вашему приложению требуется интеграция обмена сообщениями с серверной службой, мы настоятельно рекомендуем вам использовать FCM, если это возможно, а не поддерживать собственное постоянное сетевое соединение.

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

Для сообщений, которые не приводят к уведомлениям, например об обновлении содержимого приложения в фоновом режиме или запуске синхронизации данных, используйте сообщения FCM с обычным приоритетом. Сообщения с обычным приоритетом доставляются немедленно, если устройство не находится в режиме сна. Если устройство находится в режиме Doze, они доставляются во время периодических периодов обслуживания Doze или как только пользователь выводит устройство из спящего режима.

В качестве общей рекомендации, если вашему приложению требуется нисходящий обмен сообщениями, используйте FCM. Если ваше приложение уже использует FCM, убедитесь, что оно использует сообщения с высоким приоритетом только для сообщений, которые приводят к уведомлениям для пользователя.

Поддержка других вариантов использования.

Почти все приложения могут поддерживать Doze, управляя сетевыми подключениями, сигналами тревоги, заданиями и синхронизацией, а также используя сообщения FCM. Для узкого набора вариантов использования этого может быть недостаточно. Для таких случаев система предоставляет настраиваемый список приложений, которые частично освобождены от оптимизации Doze и App Standby.

Приложение, частично освобожденное от ответственности, может использовать сеть и удерживать частичную блокировку пробуждения во время режима сна и режима ожидания приложения. Однако к приложению по-прежнему применяются другие ограничения, как и к другим приложениям. Например, задания и синхронизация приложения откладываются на уровне API 23 и ниже, а его обычные сигналы тревоги AlarmManager не срабатывают. Приложение может проверить, находится ли оно в данный момент в списке исключений, вызвав isIgnoringBatteryOptimizations() .

Пользователи могут вручную настроить список исключенных приложений в меню «Настройки» > «Аккумулятор» > «Оптимизация аккумулятора». В качестве альтернативы система предоставляет приложениям способы попросить пользователей освободить их:

Примечание. Политики Google Play запрещают приложениям запрашивать прямое освобождение от функций управления питанием — Doze и App Standby — в Android 6.0 и более поздних версиях, если это не повлияет на основную функцию приложения.

Приложение может проверить, находится ли оно в данный момент в списке исключений, вызвав isIgnoringBatteryOptimizations() .

Тестируйте приложение в режимах Doze и App Standby.

Чтобы обеспечить удобство работы пользователей, полностью протестируйте свое приложение в режимах Doze и App Standby.

Проверьте свое приложение с помощью Doze.

Вы можете протестировать режим Doze, выполнив следующие действия:

  1. Настройте аппаратное или виртуальное устройство с образом системы Android 6.0 (уровень API 23) или более поздней версии.
  2. Подключите устройство к компьютеру разработки и установите приложение.
  3. Запустите приложение и оставьте его активным.
  4. Переведите систему в режим ожидания, выполнив следующую команду:
        $ adb shell dumpsys deviceidle force-idle
        
  5. Когда все будет готово, выйдите из режима ожидания, выполнив следующую команду:
        $ adb shell dumpsys deviceidle unforce
        
  6. Снова активируйте устройство, выполнив следующую команду:
        $ adb shell dumpsys battery reset
        
  7. Наблюдайте за поведением вашего приложения после повторной активации устройства. Убедитесь, что приложение корректно восстанавливается после выхода устройства из режима Doze.

Проверьте свое приложение в режиме ожидания приложения.

Чтобы протестировать режим ожидания приложения в своем приложении, выполните следующие действия:

  1. Настройте аппаратное или виртуальное устройство с образом системы Android 6.0 (уровень API 23) или более поздней версии.
  2. Подключите устройство к компьютеру разработки и установите приложение.
  3. Запустите приложение и оставьте его активным.
  4. Переведите приложение в режим ожидания приложения, выполнив следующие команды:
        $ adb shell dumpsys battery unplug
        $ adb shell am set-inactive <packageName> true
        
  5. Имитируйте пробуждение вашего приложения, используя следующие команды:
        $ adb shell am set-inactive <packageName> false
        $ adb shell am get-inactive <packageName>
        
  6. Наблюдайте за поведением вашего приложения после его пробуждения. Убедитесь, что приложение корректно выходит из режима ожидания. В частности, проверьте, работают ли уведомления и фоновые задания вашего приложения должным образом.

Приемлемые варианты использования для исключения

В следующей таблице показаны несколько вариантов использования и указано, приемлемо ли для приложений использовать намеренное действие ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS в этих ситуациях. Как правило, ваше приложение не соответствует этим исключениям, если Doze или App Standby не нарушают основную функцию приложения или не существует технической причины, по которой ваше приложение не может использовать сообщения с высоким приоритетом FCM.

Дополнительные сведения см. в разделе Поддержка других вариантов использования .

Тип Вариант использования Можно ли использовать FCM? Освобождение приемлемо? Примечания
Приложение для обмена мгновенными сообщениями, чата или звонков. Требуется доставка сообщений пользователям в реальном времени, пока устройство находится в режиме Doze или приложение находится в режиме ожидания приложения. Да, использование FCM неприемлемо. Используйте сообщения с высоким приоритетом FCM для пробуждения приложения и доступа к сети.
Да, но не использует сообщения с высоким приоритетом FCM.
Приложение для обмена мгновенными сообщениями, чата или звонков; корпоративные VOIP-приложения. Нет, я не могу использовать FCM из-за технической зависимости от другой службы обмена сообщениями или из-за того, что Doze и App Standby нарушают основную функцию приложения. Приемлемый
Приложение безопасности. Приложения, которые обеспечивают безопасность своих пользователей и их семей. Если применимо. Приемлемый
Приложение для автоматизации задач. Основная функция приложения — планирование автоматических действий, таких как обмен мгновенными сообщениями, голосовые вызовы или управление новыми фотографиями. Если применимо. Приемлемый
Приложение-компаньон для периферийных устройств. Основная функция приложения — поддержание постоянного соединения с периферийным устройством с целью предоставления периферийному устройству доступа в Интернет. Если применимо. Приемлемый
Приложению необходимо периодически подключаться к периферийному устройству для синхронизации или только к устройствам, таким как беспроводные наушники, подключенным через стандартные профили Bluetooth. Если применимо. Не приемлемо