В Android есть две функции энергосбережения, которые продлевают время работы от батареи, управляя поведением приложений, когда устройство не подключено к источнику питания: спящий режим и App Standby. Спящий режим снижает расход заряда батареи, откладывая фоновую активность ЦП и сетевую активность для приложений, когда устройство не используется в течение длительного времени. Режим ожидания откладывает сетевую активность в фоновом режиме для приложений, которые пользователь давно не открывал.
В спящем режиме доступ приложений к ресурсам, требующим значительного расхода заряда батареи, откладывается до перерыва на техническое обслуживание. Ограничения перечислены в разделе Ограничения управления питанием.
Спящий режим и App Standby управляют поведением всех приложений, работающих на устройствах с Android 6.0 или более поздней версии, независимо от того, предназначены ли они для целевого уровня API 23. Чтобы обеспечить удобство для пользователей, протестируйте приложение в спящем режиме и режиме App Standby и при необходимости внесите изменения в код. Подробная информация приведена в разделах ниже.
Что такое спящий режим
Если устройство не подключено к сети, не используется и его экран выключен, оно переходит в спящий режим. В спящем режиме система пытается экономить заряд батареи, ограничивая доступ приложений к сети и сервисам, которые активно используют процессор. Кроме того, приложениям запрещается доступ к сети, а их задачи, синхронизация и стандартные будильники откладываются.
Периодически система ненадолго выходит из спящего режима, чтобы приложения могли выполнить отложенные действия. В течение этого периода система выполняет все ожидающие синхронизации, задачи и сигналы, а также разрешает приложениям доступ к сети.
По окончании перерыва на техническое обслуживание система снова переходит в спящий режим, приостанавливая доступ к сети и откладывая выполнение заданий, синхронизацию и сигналы. Со временем система планирует перерывы на техническое обслуживание реже, что помогает снизить потребление заряда батареи, когда устройство долго не используется и не заряжается.
Когда пользователь выводит устройство из спящего режима, перемещая его, включая экран или подключая зарядное устройство, система выходит из спящего режима и все приложения возобновляют нормальную работу.
Ограничения спящего режима
В спящем режиме на приложения накладываются следующие ограничения:
- Приостанавливает доступ к сети.
- Игнорирует запрет блокировки.
- Откладывает стандартные оповещения
AlarmManager, включаяsetExact()иsetWindow(), до следующего перерыва на техническое обслуживание.- Если вам нужно установить будильники, которые будут срабатывать в спящем режиме, используйте
setAndAllowWhileIdle()илиsetExactAndAllowWhileIdle(). - Будильники, установленные с помощью приложения
setAlarmClock(), продолжат работать в обычном режиме. Система выходит из спящего режима незадолго до срабатывания этих будильников.
- Если вам нужно установить будильники, которые будут срабатывать в спящем режиме, используйте
- Не сканирует сети Wi-Fi.
- Запрещает запуск адаптеров синхронизации.
- Не позволяет запустить
JobScheduler.
Контрольный список для спящего режима
- По возможности используйте Firebase Cloud Messaging (FCM) для передачи сообщений от сервера к клиенту.
- Если пользователям нужно сразу увидеть уведомление, используйте тип сообщения
RemoteNotification. Дополнительную информацию можно найти в документации FCM по типу сообщенийRemoteNotification. - Предоставьте достаточно информации в исходных полезных данных сообщения, чтобы последующий доступ к сети не требовался.
- Установите критические оповещения с помощью
setAndAllowWhileIdle()иsetExactAndAllowWhileIdle(). - Протестируйте приложение в спящем режиме.
Как адаптировать приложение к спящему режиму
Спящий режим может по-разному влиять на приложения в зависимости от их возможностей и используемых сервисов. Многие приложения работают в спящем режиме без изменений. В некоторых случаях вам потребуется оптимизировать работу приложения с сетью, будильниками, заданиями и синхронизацией. Приложения должны эффективно управлять действиями во время каждого перерыва на техническое обслуживание.
Для планирования будильников можно использовать два метода AlarmManager: setAndAllowWhileIdle() и setExactAndAllowWhileIdle(). С помощью этих методов можно настроить будильники, которые будут срабатывать, даже если устройство находится в спящем режиме.
Ограничение доступа к сети в спящем режиме также может повлиять на работу вашего приложения, особенно если оно использует сообщения в реальном времени, например уведомления. Если для получения сообщений приложению требуется постоянное подключение к сети, по возможности используйте Firebase Cloud Messaging (FCM).
Чтобы проверить, как приложение работает в спящем режиме, вы можете использовать команды adb, которые принудительно переводят систему в спящий режим и выводят из него. Подробнее о том, как тестировать приложения в спящем режиме и режиме App Standby…
Что такое App Standby
App Standby позволяет системе определить, что приложение неактивно, когда пользователь не использует его. Система определяет, что приложение не используется, если пользователь не открывал его в течение определенного времени и не выполняется ни одно из следующих условий:
- Пользователь запускает приложение.
- В приложении есть процесс, который в данный момент выполняется в активном режиме (как действие или активная служба) или используется другим действием или активной службой.
- Приложение генерирует уведомление, которое пользователи видят на заблокированном экране или в области уведомлений.
Когда пользователь подключает устройство к источнику питания, система выводит приложения из режима ожидания, позволяя им свободно подключаться к сети, выполнять любые отложенные задачи и синхронизировать данные. Если устройство не используется в течение длительного времени, система разрешает бездействующим приложениям доступ к сети примерно раз в день.
Используйте FCM для взаимодействия с приложением, когда устройство находится в спящем режиме
Firebase Cloud Messaging (FCM) – это сервис, который позволяет в реальном времени отправлять сообщения из облака на устройства Android. FCM обеспечивает единое постоянное подключение к облаку. Все приложения, которым требуется обмен сообщениями в реальном времени, могут использовать это подключение. Это позволяет значительно оптимизировать расход заряда батареи, поскольку приложениям не нужно поддерживать собственные постоянные подключения, которые могут быстро разряжать батарею. Поэтому, если вашему приложению требуется интеграция обмена сообщениями с серверной службой, мы настоятельно рекомендуем по возможности использовать FCM, а не поддерживать собственное постоянное сетевое подключение.
FCM оптимизирован для работы со спящим режимом и режимом App Standby. Тип сообщений FCM RemoteNotification позволяет активировать приложение, чтобы привлечь пользователя. В спящем режиме или режиме App Standby система доставляет сообщение и предоставляет приложению временный доступ к сетевым сервисам и частичным блокировкам в спящем режиме, а затем возвращает устройство или приложение в режим ожидания. Для срочных уведомлений, видимых пользователю, рекомендуется использовать типы сообщений RemoteNotification, чтобы обеспечить доставку в спящем режиме. Эти сообщения могут приводить к появлению уведомлений. Подробную информацию можно найти в
руководстве по FCM для RemoteNotification.
Для сообщений, которые не приводят к появлению уведомлений, например для поддержания актуальности контента приложения в фоновом режиме или запуска синхронизации данных, используйте сообщения FCM BackgroundSync. Такие сообщения имеют низкий приоритет и могут задерживаться или ограничиваться для экономии заряда батареи.
Если вашему приложению требуется обмен сообщениями в нисходящем направлении, используйте FCM. Если в вашем приложении уже используется FCM, убедитесь, что для сообщений, которые приводят к показу уведомлений пользователям, используется RemoteNotification.
Не используйте RemoteNotification в следующих случаях:
- Когда уведомление точно не будет показано.
- Для немедленной доставки сообщений, которые только обновляют состояние приложения, например поддерживают актуальность контента в фоновом режиме или инициируют синхронизацию данных.
- Для запроса разрешений у конечного пользователя.
Поддержка других вариантов использования
Почти все приложения поддерживают спящий режим, управляя сетевым подключением, будильниками, задачами и синхронизацией, а также используя сообщения FCM. В некоторых случаях этого может быть недостаточно. Для таких случаев в системе предусмотрен настраиваемый список приложений, на которые не распространяются некоторые ограничения спящего режима и режима App Standby.
Приложение, для которого сделано частичное исключение, может использовать сеть и частичный запрет блокировки в спящем режиме и режиме App Standby. Однако на него распространяются другие ограничения, как и на остальные приложения. Например, на уровне API 23 и ниже откладываются задачи и синхронизация приложения, а также не срабатывают обычные оповещения AlarmManager. Приложение может проверить, находится ли оно в списке исключений, вызвав метод isIgnoringBatteryOptimizations().
Пользователи могут вручную настроить список исключенных приложений в разделе Настройки > Батарея > Экономия заряда батареи. Кроме того, система позволяет приложениям запрашивать у пользователей исключение из режима энергосбережения.
- Большинство приложений могут вызывать намерение, содержащее
ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS. - Приложения, соответствующие допустимому варианту использования, могут вызывать намерение, содержащее действие
ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS, чтобы пользователь мог добавить приложение в список исключений напрямую, не переходя в системные настройки.
Приложение может проверить, находится ли оно в списке исключений, вызвав метод isIgnoringBatteryOptimizations().
Тестирование спящего режима и App Standby
Чтобы обеспечить удобство для пользователей, протестируйте приложение в спящем режиме и режиме App Standby.
Как протестировать приложение в спящем режиме
Чтобы протестировать спящий режим, выполните следующие действия:
- Настройте аппаратное или виртуальное устройство с образом системы Android 6.0 (уровень API 23) или более поздней версии.
- Подключите устройство к компьютеру для разработки и установите приложение.
- Запустите приложение и не закрывайте его.
- Принудительно переведите систему в режим ожидания, выполнив следующую команду:
$ adb shell dumpsys deviceidle force-idle - Когда все будет готово, выйдите из режима ожидания, выполнив следующую команду:
$ adb shell dumpsys deviceidle unforce - Повторно активируйте устройство, выполнив следующую команду:
$ adb shell dumpsys battery reset - Проверьте, как работает приложение после повторной активации устройства. Убедитесь, что приложение корректно восстанавливает работу после выхода устройства из спящего режима.
Как протестировать приложение в режиме App Standby
Чтобы протестировать режим ожидания в приложении, выполните следующие действия:
- Настройте аппаратное или виртуальное устройство с образом системы Android 6.0 (уровень API 23) или более поздней версии.
- Подключите устройство к компьютеру для разработки и установите приложение.
- Запустите приложение и не закрывайте его.
- Принудительно переведите приложение в режим ожидания, выполнив следующие команды:
$ 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> - Проверьте, как ведет себя приложение после выхода из спящего режима. Убедитесь, что приложение корректно выходит из режима ожидания. В частности, проверьте, правильно ли работают уведомления и фоновые задачи.
Допустимые случаи использования исключения
В таблице ниже приведены примеры использования действия intent ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS и указано, допустимо ли оно в каждом случае. Как правило, ваше приложение не соответствует этим исключениям, если только спящий режим или App Standby не нарушают его основные функции или нет технической причины, по которой оно не может использовать сообщения FCM RemoteNotification.
Подробнее о поддержке других сценариев использования…
| Тип | Пример использования | Можно ли использовать FCM? | Допустимо ли исключение? | Примечания |
|---|---|---|---|---|
| Приложение для обмена мгновенными сообщениями, чата или звонков. | Требуется доставка сообщений пользователям в реальном времени, когда устройство находится в спящем режиме или приложение – в режиме App Standby. | Да, с помощью FCM | Недопустимо | Используйте сообщения FCM RemoteNotification, чтобы активировать приложение и получить доступ к сети. |
Да, но не использует сообщения FCM RemoteNotification. |
||||
| Приложения для обмена мгновенными сообщениями, чаты, приложения для звонков, корпоративные приложения для IP-телефонии. | Нет, FCM нельзя использовать из-за технической зависимости от другого сервиса обмена сообщениями, или спящий режим и App Standby нарушают работу основных функций приложения. | Допустимо | ||
| Приложение "Безопасность". | Приложения, которые помогают пользователям защитить себя и свои семьи. | Эта информация указывается только при необходимости, | Допустимо | |
| Приложение для автоматизации задач. | Основная функция приложения – планирование автоматических действий, например для обмена мгновенными сообщениями, голосовых вызовов или управления новыми фотографиями. | Эта информация указывается только при необходимости, | Допустимо | |
| Сопутствующее приложение для периферийного устройства. | Основная функция приложения – поддерживать постоянное подключение к периферийному устройству, чтобы предоставлять ему доступ к интернету. | Эта информация указывается только при необходимости, | Допустимо | |
| Приложению нужно лишь периодически подключаться к периферийному устройству для синхронизации или только к устройствам, например беспроводным наушникам, подключенным через стандартные профили Bluetooth. | Эта информация указывается только при необходимости, | Недопустимо |