Android 9 (уровень API 28) и более поздние версии поддерживают App Standby Buckets . App Standby Buckets помогают системе расставлять приоритеты запросов приложений на ресурсы на основе того, как давно и как часто используются приложения. На основе шаблонов использования приложений каждое приложение помещается в один из пяти приоритетных бакетов . Система ограничивает ресурсы устройства, доступные каждому приложению, на основе того, в каком бакете находится приложение.
Приоритетные ведра
Система динамически назначает каждое приложение приоритетному сегменту, переназначая приложения по мере необходимости. Система может полагаться на предварительно загруженное приложение, которое использует машинное обучение для определения вероятности использования каждого приложения и назначает приложения соответствующим сегментам.
Если системное приложение отсутствует на устройстве, система по умолчанию сортирует приложения на основе того, как давно они использовались. Более активные приложения назначаются в контейнеры, которые дают им более высокий приоритет, что делает больше системных ресурсов доступными для приложения. В частности, контейнер определяет, как часто запускаются задания приложения и как часто приложение может активировать оповещения. Эти ограничения применяются только тогда, когда устройство работает от батареи. Пока устройство заряжается, система не накладывает эти ограничения.
Приоритетными сегментами являются следующие:
- Активно : приложение используется или использовалось совсем недавно.
- Рабочий набор : приложение используется регулярно.
- Часто : приложение используется часто, но не ежедневно.
- Редко : приложение используется нечасто.
- Ограничено : приложение потребляет много системных ресурсов или может вести себя нежелательно.
В дополнение к этим приоритетным сегментам есть специальный сегмент never для приложений, которые установлены, но никогда не запускались. Система накладывает серьезные ограничения на эти приложения.
Следующие описания предназначены для непредиктивного случая. Напротив, когда прогнозирование использует машинное обучение для прогнозирования поведения, сегменты выбираются в ожидании следующих действий пользователя, а не на основе недавнего использования. Например, недавно использованное приложение может оказаться в редком сегменте, поскольку машинное обучение предсказывает, что приложение может не использоваться в течение нескольких часов.
Активный
Приложение находится в активной корзине, пока оно используется, использовалось совсем недавно или когда оно выполняет любое из следующих действий:
- Запускает действие.
- Запускает длительную службу переднего плана.
- Нажимается пользователем из уведомления.
Если приложение находится в активной корзине, система накладывает минимальные ограничения на задания или оповещения приложения:
- Начиная с Android 16 (API уровня 36) фоновые задания имеют щедрую квоту времени выполнения, если они запускаются приложением в активном контейнере. Это включает задания, запланированные напрямую с помощью
JobScheduler
, а также задания, созданные другими библиотеками, такими как WorkManager илиDownloadManager
.
Взаимодействие с пользователем назначает приложениям статус активных
На Android 9 (уровень API 28) и выше, когда пользователь взаимодействует с вашим приложением определенным образом, система временно помещает ваше приложение в активную корзину. После того, как пользователь прекращает взаимодействие с вашим приложением, система помещает его в корзину на основе истории использования.
Ниже приведены примеры взаимодействий, которые запускают такое поведение системы:
Пользователь нажимает на уведомление, которое отправляет ваше приложение.
Пользователь взаимодействует с активной службой в вашем приложении, нажимая кнопку мультимедиа .
Пользователь подключается к вашему приложению во время взаимодействия с Android Automotive OS , где ваше приложение использует либо службу переднего плана, либо
CONNECTION_TYPE_PROJECTION
.
Рабочий набор
Приложение находится в рабочем наборе , если оно часто запускается, но не активно. Например, приложение социальной сети, которое пользователь запускает почти ежедневно, скорее всего, будет в рабочем наборе. Приложения также переходят в рабочий набор, если они используются косвенно.
Если приложение находится в рабочем наборе, система накладывает мягкие ограничения на его способность запускать задания и активировать оповещения. Подробности см. в разделе Ограничения ресурсов управления питанием .
Частый
Приложение находится в частой корзине, если оно используется регулярно, но не обязательно каждый день. Например, приложение для отслеживания тренировок, которое пользователь запускает в спортзале, может находиться в частой корзине.
Если приложение находится в частом сегменте, система накладывает более строгие ограничения на его способность запускать задания и активировать оповещения. Подробнее см. в разделе Ограничения ресурсов управления питанием .
Редкий
Приложение находится в редкой корзине, если оно используется нечасто. Например, приложение для отеля, которое пользователь запускает только во время проживания в этом отеле, может находиться в редкой корзине.
Если приложение находится в редком сегменте, система накладывает строгие ограничения на его способность запускать задания и активировать оповещения. Система также ограничивает возможность приложения подключаться к Интернету. Подробности см. в разделе Ограничения ресурсов управления питанием .
Ограниченный
Этот контейнер, добавленный в Android 12 (API уровня 31), имеет самый низкий приоритет и самые высокие ограничения из всех контейнеров. Система учитывает поведение вашего приложения, например, как часто пользователь взаимодействует с ним, чтобы решить, следует ли помещать ваше приложение в ограниченный контейнер.
На Android 13 (уровень API 33) и выше, если ваше приложение не подпадает под исключение , система помещает его в ограниченную корзину в следующих ситуациях:
Пользователь не взаимодействует с вашим приложением в течение определенного количества дней. На Android 12 (уровень API 31) и 12L (уровень API 32) количество дней составляет 45. Android 13 сокращает количество дней до 8.
Ваше приложение вызывает чрезмерное количество трансляций или привязок в течение 24-часового периода.
Если система помещает ваше приложение в ограниченную корзину, применяются следующие ограничения:
- Вы можете запускать задания один раз в день в 10-минутном пакетном сеансе. Во время этого сеанса система группирует задания вашего приложения с заданиями других приложений.
- Ограниченные задания не запускаются сами по себе. В то же время должно быть запущено или отложено по крайней мере одно другое задание, которое может включать любое другое задание.
- Ваше приложение может выполнять меньше ускоренных заданий по сравнению с тем, когда система помещает ваше приложение в менее строгую группу.
- Ваше приложение может вызывать один будильник в день. Этот будильник может быть как точным , так и неточным .
Исключения из ограниченного списка
Следующие типы приложений не попадают в ограниченную корзину и обходят триггер бездействия даже на Android 12 и выше:
- Приложения для сопутствующих устройств
- Приложения, работающие на устройстве в демонстрационном режиме
- Приложения владельца устройства
- Приложения владельца профиля
- Постоянные приложения
- VPN-приложения
- Приложения с ролью
ROLE_DIALER
- Приложения, которые пользователь явно указал в системных настройках как предоставляющие «неограниченную» функциональность
- Приложения с активными виджетами
- Приложения, которым предоставлено хотя бы одно из следующих разрешений:
Оцените приоритетный сегмент
Чтобы проверить, к какому сегменту относится ваше приложение, выполните одно из следующих действий:
Вызовите
getAppStandbyBucket()
.Выполните следующую команду в окне терминала:
adb shell am get-standby-bucket PACKAGE_NAME
Система ограничивает производительность вашего приложения всякий раз, когда оно помещается в контейнер ожидания приложения, значение которого больше STANDBY_BUCKET_ACTIVE
(10).
Лучшие практики
Если ваше приложение следует лучшим практикам для Doze и режима ожидания приложения, то последующие функции управления питанием не сложны. Однако некоторые поведения приложений, которые ранее работали хорошо, могут вызывать проблемы.
- Не пытайтесь манипулировать системой, чтобы поместить ваше приложение в определенную корзину. Метод установки приоритета системой может измениться, и каждый производитель устройств может решить написать свое собственное приложение для распределения по сегментам с собственным алгоритмом. Вместо этого убедитесь, что ваше приложение ведет себя соответствующим образом, независимо от того, в какой корзине оно находится.
- Если у приложения нет активности запуска, оно может никогда не перейти в активную корзину. Рассмотрите возможность перепроектирования вашего приложения, чтобы иметь такую активность.
Если пользователи не могут взаимодействовать с уведомлениями приложения, пользователи не могут запустить продвижение приложения в активную корзину. В этом случае рассмотрите возможность перепроектирования некоторых уведомлений, которые позволяют пользователям взаимодействовать. Некоторые рекомендации см. в шаблонах проектирования уведомлений Material Design.
Если приложение не отображает уведомление при получении высокоприоритетного сообщения Firebase Cloud Messaging (FCM) , пользователь не может взаимодействовать с приложением и, таким образом, продвигать его в активную корзину. Фактически, единственное предполагаемое использование высокоприоритетных сообщений FCM — это отправка уведомления пользователю, поэтому такая ситуация не должна возникать. На 12L (уровень API 32) и ниже, если вы ненадлежащим образом пометите сообщение FCM как высокоприоритетное, когда оно не вызывает взаимодействия с пользователем, это может привести к снижению приоритета будущих сообщений.
Если приложения разделены на несколько пакетов, эти пакеты могут находиться в разных сегментах и иметь разные уровни доступа. Протестируйте эти приложения с пакетами, назначенными в разные сегменты, чтобы убедиться, что приложение ведет себя правильно.