Android 10 представляет опцию расписания экономии батареи, которая называется based on routine . Эта опция позволяет приложению, выбранному OEM, подавать сигналы системе для более интеллектуального расписания экономии батареи. Эта опция требует настройки и не является обязательной для реализации.
Конфигурация устройства
Спецификация поставщика
Чтобы уведомить пользовательский интерфейс настроек о том, что устройство настроено правильно, используйте наложение конфигурации, чтобы переопределить значение config_batterySaverScheduleProvider
на имя пакета вашего приложения.
Например, если вы хотите, чтобы пакет приложения com.google.android.apps.turbo
управлял настройками на основе рутины , то вам следует задать следующее значение конфигурации:
<string name="config_batterySaverScheduleProvider" translatable="false">
com.google.android.apps.turbo</string>
Теперь телефон должен отобразить основанную на рутине опцию. Для проверки создайте свой образ, загрузите его в телефон и перейдите в Настройки > Аккумулятор > Экономия заряда > Расписание экономии заряда . Должна появиться основанная на рутине опция.
Порог отключения по умолчанию
Новое поле config_dynamicPowerSavingsDefaultDisableThreshold
определяет уровень заряда батареи, при котором система отключает функцию экономии батареи, если она была включена планировщиком на основе рутины . Значение по умолчанию в системе составляет 80%, но вы можете изменить его.
Конфигурация приложения
Разрешения
API, необходимые приложению для включения экономии заряда батареи из приложения, защищены разрешением android.permission.POWER_SAVER
. Это сигнатурное/привилегированное разрешение, поэтому предоставьте приложению, которое должно иметь возможность активировать экономию заряда батареи, это разрешение в вашем privapp-whitelist
.
Пример предоставления разрешения privapp
приложению:
<privapp-permissions package="com.google.android.apps.turbo">
<permission name="android.permission.POWER_SAVER"/>
</privapp-permissions>
Если вы заранее не предоставите это разрешение версии приложения на системном образе, приложение не сможет получить разрешение или правильно вызвать API. Система не предоставляет никакой обратной связи, кроме обычных ошибок разрешений, поэтому проверьте, можете ли вы вызывать API, и понаблюдайте за их эффектами.
Установка
Для правильной работы основанной на рутине функции необходимо предварительно установить приложение на образе системы с требуемым разрешением. Дайте только одному приложению разрешение POWER_SAVER
и разрешите ему управлять API основанной на рутине . Поведение функции, когда более одного приложения пытаются использовать разрешение и API, не поддерживается и не определено.
Активировать функцию экономии заряда батареи
API-интерфейсы
Если настройка прошла успешно, то OEM-приложение, указанное в конфигурации, должно успешно вызвать связанный метод в PowerManager для запуска режима экономии заряда батареи:
public boolean setDynamicPowerSaveHint(boolean powerSaveHint, int disableThreshold)
Если включена опция расписания на основе рутинного энергосбережения и приложение вызывает этот метод со значением true
для powerSaveHint
, то энергосбережение включается. Укажите disableThreshold
, чтобы, если приложение не может связаться с системой, система все равно знала, при каком проценте заряда батареи безопасно отключить энергосбережение.
Этот API может быть переопределен пользователем и отложен в сторону экономии батареи так же, как и автоматическая экономия батареи на основе процентов. Для получения дополнительной информации см. документацию API .
Чтобы убедиться, что вызовы API выполняются успешно, выполните запрос к глобальным настройкам, чтобы убедиться, что резервная настройка изменила значение в соответствии с вызовами API .
Например, если пользователь выбрал режим экономии заряда батареи и приложение вызывает setDynamicPowerSaveHint(true, 10)
, глобальные настройки должны иметь следующие значения:
automatic_power_save_mode: 1
dynamic_power_savings_disable_threshold: 10
dynamic_power_savings_enabled: 1
Если затем вызвать setDynamicPowerSaveHint(false, 25)
, значения должны быть следующими:
automatic_power_save_mode: 1
dynamic_power_savings_disable_threshold: 25
dynamic_power_savings_enabled: 0
Вы можете проверить эти значения с помощью этой команды adb
:
adb shell settings get global <setting-name>
Проверка
Нет автоматизированного способа проверки этой функции, поскольку нет способа узнать, какое поведение будет использовать OEM-производитель, чтобы решить, когда запускать режим экономии заряда батареи. Таким образом, OEM-производители несут ответственность за тестирование своей интеграции, чтобы убедиться, что поведение соответствует ожиданиям. В частности, проверьте, может ли устройство выполнять следующие задачи:
- Пользователь выбирает на основе процента в пользовательском интерфейсе графика экономии заряда батареи и выбирает 15%. Режим экономии заряда батареи должен включаться автоматически ТОЛЬКО при достижении 15% заряда батареи.
- Пользователь выбирает на основе рутины в пользовательском интерфейсе графика экономии батареи. Когда приложение вызывает API с
true
, экономия батареи включается. Кроме того, экономия батареи автоматически выключается, если устройство заряжено до указанного порогового уровня и отключено от сети. - Пользователь не выбирает ничего в пользовательском интерфейсе графика экономии батареи. Экономия батареи НИКОГДА не должна включаться автоматически.
- Если приложение включает режим экономии заряда батареи, а пользователь вручную отключает его (с помощью быстрых настроек, настроек и т. д.), режим должен ОСТАВАТЬСЯ ВЫКЛЮЧЕННЫМ до тех пор, пока пользователь не включит его вручную или не подключит устройство к электросети.