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

作者:帅得不敢出门

相关推荐
三少爷的鞋35 分钟前
Kotlin 协程的七重境界:从 launch(IO) 到执行模型设计
android
-SOLO-10 小时前
Android Event 日志完全指南
android
壮哥_icon11 小时前
【Android 系统开发】从掉帧卡顿到丝滑:高频硬件中断(IRQ)的 CPU 亲和性性能优化实战
android·性能优化
千里马学框架11 小时前
Android Framework 新手学习踩坑建议指南
android·智能手机·性能优化·framework·aaos·车载开发·系统工程师
我命由我1234513 小时前
执行 Gradle 指令报错,无法将“grep”项识别为 cmdlet、函数、脚本文件或可运行程序的名称
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
狂奔solar14 小时前
ARMA 模型:从白噪声到万能逼近器
android
渣渣灰飞15 小时前
MySQL 系统学习 第五阶段:企业级 MySQL 实战开发 第二章:RBAC 权限系统设计
android·学习·mysql
qq_4228286215 小时前
android 图形学之图层数据送显及合成图层(七)
android
MiyamuraMiyako16 小时前
Compose:从自动滚动到双锚点 LazyLayout
android·android jetpack
用户634214199350718 小时前
base_logger_core --- 跨平台 C++ 日志核心库
android