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专栏

作者:帅得不敢出门

相关推荐
智算菩萨8 小时前
MP3音频编码原理深度解析与Python全参数调优实战:从心理声学模型到LAME编码器精细控制
android·python·音视频
studyForMokey9 小时前
【Android面试】Activity生命周期专题
android·面试·职场和发展
chehaoman10 小时前
MySQL的索引
android·数据库·mysql
恋猫de小郭13 小时前
React Native 鸿蒙 2026 路线发布,为什么它的适配成本那么高?
android·前端·react native
studyForMokey13 小时前
【Android面试】窗口机制专题
android·面试·职场和发展
用户0132014360314 小时前
Android 资源管理与常用布局详解|基础入门
android
陆业聪15 小时前
从 OpenClaw 到 Android:Harness Engineering 是怎么让 Agent 变得可用的
android·人工智能·ai编程
stevenzqzq17 小时前
颜色透明度转换技术文档(Android/Compose)
android
巴黎没有摩天轮Li17 小时前
Android JVMTI 接入流程
android
2501_9159090618 小时前
iOS 抓包不越狱,代理抓包 和 数据线直连抓包两种实现方式
android·ios·小程序·https·uni-app·iphone·webview