文章目录
安卓省电模式是安卓系统为延长手机续航时间而设计的功能,通过限制一些耗电较大的功能和进程来降低电池能耗。安卓充电时自动关闭省电模式。
安卓充电时自动关闭省电模式
安卓充电时自动关闭省电模式是系统的一种默认设置,主要有以下原因和原理:
设计逻辑
充电时,手机连接到外部电源,不再依赖电池供电,此时开启省电模式的意义不大。而且,用户在充电时可能会使用手机,关闭省电模式可以提供更好的性能和使用体验,例如保证屏幕亮度、处理器性能等不受限制,让应用运行更加流畅,避免因省电模式的限制而影响使用。
电量检测
当手机检测到充电器连接时,会触发相应的电源管理机制。系统通过检测充电电流、电压等信号,判断手机是否处于充电状态。一旦确定正在充电,就会自动关闭省电模式,使手机恢复到正常的性能状态。
不同的安卓手机厂商可能会对省电模式及充电时的相关设置进行定制,例如一些手机可以设置在充电至一定电量后才自动关闭省电模式,如真我手机可设置充电至 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";
- frameworks/base/packages/SettingsProvider/res/values/defaults.xml
设置默认值到defaults.xml
xml
<integer name="def_low_power_sticky_auto_disable_enabled">0</integer>
- 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);
- 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
- 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相关专栏
作者:帅得不敢出门