Android Framework修改Settings省电模式默认值

文章目录

安卓省电模式是安卓系统为延长手机续航时间而设计的功能,通过限制一些耗电较大的功能和进程来降低电池能耗。安卓充电时自动关闭省电模式。

安卓充电时自动关闭省电模式

安卓充电时自动关闭省电模式是系统的一种默认设置,主要有以下原因和原理:

设计逻辑

充电时,手机连接到外部电源,不再依赖电池供电,此时开启省电模式的意义不大。而且,用户在充电时可能会使用手机,关闭省电模式可以提供更好的性能和使用体验,例如保证屏幕亮度、处理器性能等不受限制,让应用运行更加流畅,避免因省电模式的限制而影响使用。

电量检测

当手机检测到充电器连接时,会触发相应的电源管理机制。系统通过检测充电电流、电压等信号,判断手机是否处于充电状态。一旦确定正在充电,就会自动关闭省电模式,使手机恢复到正常的性能状态。

不同的安卓手机厂商可能会对省电模式及充电时的相关设置进行定制,例如一些手机可以设置在充电至一定电量后才自动关闭省电模式,如真我手机可设置充电至 90% 后自动关闭省电模式。小米、红米手机可以在设置中点击【电池与性能】-【设置】-【超级省电】,选择 "充电后自动关闭" 功能来控制充电时是否自动退出超级省电模式

代码定位

UI界面

设置中位置,可以开启或关闭省电模式,且省电模式时是否开启"充电时关闭"省电模式。

系统中对应的值

修改这个配置项,会相应改变Settings Global中的low_power_sticky_auto_disable_enabled值

默认情况搜索不到值,如下图

把充电时关闭这个开关关闭后,值就变了,如下图

代码

此开关对应代码

frameworks/base/core/java/android/provider/Settings.java

java 复制代码
        /**
         * Whether sticky battery saver should be deactivated once the battery level has reached the
         * threshold specified by {@link #LOW_POWER_MODE_STICKY_AUTO_DISABLE_LEVEL}.
         *
         * @hide
         */
        public static final String LOW_POWER_MODE_STICKY_AUTO_DISABLE_ENABLED =
                "low_power_sticky_auto_disable_enabled";
  1. frameworks/base/packages/SettingsProvider/res/values/defaults.xml
    设置默认值到defaults.xml
xml 复制代码
<integer name="def_low_power_sticky_auto_disable_enabled">0</integer>
  1. frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
    加载默认值的代码
java 复制代码
            loadIntegerSetting(stmt, Settings.Global.LOW_POWER_MODE_STICKY_AUTO_DISABLE_ENABLED,
                    R.integer.def_low_power_sticky_auto_disable_enabled);
  1. frameworks/base/services/core/java/com/android/server/power/batterysaver
    如果low_power_sticky_auto_disable_enabled没有设置,默认会设置为1的
java 复制代码
    @GuardedBy("mLock")
    private void refreshSettingsLocked() {
        final boolean lowPowerModeEnabled = getGlobalSetting(
                Settings.Global.LOW_POWER_MODE, 0) != 0;
        final boolean lowPowerModeEnabledSticky = getGlobalSetting(
                Settings.Global.LOW_POWER_MODE_STICKY, 0) != 0;
        final boolean dynamicPowerSavingsBatterySaver = getGlobalSetting(
                Settings.Global.DYNAMIC_POWER_SAVINGS_ENABLED, 0) != 0;
        final int lowPowerModeTriggerLevel = getGlobalSetting(
                Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL, 0);
        final int automaticBatterySaverMode = getGlobalSetting(
                Settings.Global.AUTOMATIC_POWER_SAVE_MODE,
                PowerManager.POWER_SAVE_MODE_TRIGGER_PERCENTAGE);
        final int dynamicPowerSavingsDisableThreshold = getGlobalSetting(
                Settings.Global.DYNAMIC_POWER_SAVINGS_DISABLE_THRESHOLD,
                mDynamicPowerSavingsDefaultDisableThreshold);
        // 注意下面这行,其实是把默认值1写入了
        final boolean isStickyAutoDisableEnabled = getGlobalSetting(
                Settings.Global.LOW_POWER_MODE_STICKY_AUTO_DISABLE_ENABLED, 1) != 0;
        final int stickyAutoDisableThreshold = getGlobalSetting(
                Settings.Global.LOW_POWER_MODE_STICKY_AUTO_DISABLE_LEVEL, 90);

        setSettingsLocked(lowPowerModeEnabled, lowPowerModeEnabledSticky,
                lowPowerModeTriggerLevel,
                isStickyAutoDisableEnabled, stickyAutoDisableThreshold,
                automaticBatterySaverMode,
                dynamicPowerSavingsBatterySaver, dynamicPowerSavingsDisableThreshold);
    }

在另外一个文件也有,如果不存在则默认会读取为1

  1. packages/apps/Settings/src/com/android/settings/fuelgauge/batterysaver/BatterySaverStickyPreferenceController.java
java 复制代码
    @Override
    public boolean isChecked() {
        return Settings.Global.getInt(mContext.getContentResolver(),
            Global.LOW_POWER_MODE_STICKY_AUTO_DISABLE_ENABLED, 1) == 1;
    }

Android相关专栏

Android Framework专栏
Android专栏

作者:帅得不敢出门

相关推荐
冬奇Lab17 小时前
Android系统启动流程深度解析:从Bootloader到Zygote的完整旅程
android·源码阅读
泓博19 小时前
Android中仿照View selector自定义Compose Button
android·vue.js·elementui
zhangphil20 小时前
Android性能分析中trace上到的postAndWait
android
十里-20 小时前
vue2的web项目打包成安卓apk包
android·前端
p***199420 小时前
MySQL——内置函数
android·数据库·mysql
兆子龙21 小时前
我成了🤡, 因为不想看广告,花了40美元自己写了个鸡肋挂机脚本
android·javascript
儿歌八万首1 天前
Android 全局监听神器:registerActivityLifecycleCallbacks 解析
android·kotlin·activity
弹幕教练宇宙起源1 天前
cmake文件介绍及用法
android·linux·c++
&岁月不待人&1 天前
一个Android高级开发的2025总结 【个人总结无大话】
android
吴声子夜歌1 天前
RxJava——FlowableProcessor详解
android·echarts·rxjava