文章主要参考网址:http://www.th7.cn/Program/Android/201509/577840.shtml
android5.1 省电模式开启位置:
设置——电池——节电助手(充电状态下默认无法开启,即强制关闭)
省电模式开启后系统状态:
不同于其他第三方省电app:除通知图标外顶部状态栏、底部通知栏颜色全部变成亮橙色,大部分图标等资源添加橙色,应用顶部栏也会变成橙色。
其他行为:
1.屏幕亮度调低;2.后台(大部分)数据关闭;3.动画全部取消;4.震动关闭。(即通过牺牲性能达到省电目的)。
涉及到广播
POWERMANAGER.ACTION_POWER_SAVE_MODE_CHANGED
POWERMANAGER.ACTION_POWER_SAVE_MODE_CHANGING
相关代码:
设置应用入口文件:
./packages/apps/Settings/src/com/android/settings/fuelgauge/BatterySaverSettings.java
托盘显示:
./frameworks/base/packages/SystemUI/src/com/android/systemui/power/PowerUI.java
./frameworks/base/packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java
托盘中callback回调函数onPowerSaveChanged():
./frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java
onPowerSaveChanged():(systemui内部处理):
./frameworks/base/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java
./frameworks/base/packages/SystemUI/src/com/android/systemui/doze/DozeHost.java
./frameworks/base/packages/SystemUI/src/com/android/systemui/doze/DozeService.java
./frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java
./frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
./frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
./frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeaderView.java
./frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java
./frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java
GPS根据mode 更新处理:
./frameworks/base/services/core/java/com/android/server/location/GpsLocationProvider.java
发送模式切换ing/切换广播:
./frameworks/base/services/core/java/com/android/server/power/PowerManagerService.java
voice根据mode 更新处理:
./frameworks/base/services/voiceinteraction/java/com/android/server/voiceinteraction/SoundTriggerHelper.java
流程分析
设置省电模式入口文件
./packages/apps/Settings/src/com/android/settings/fuelgauge/BatterySaverSettings.java
关键代码:
节电助手开启或关闭时,调用onSwitchChanged()方法,参数isChecked表示节电助手属于开启(true)或关闭(false)状态。开启时,发送消息mStartMode开启新线程开始省电模式,否则关闭省电模式。
新线程开启后主要执行trySetPowerSaveMode()方法。节电助手开启时参数为true,关闭时参数为false。
提供调用接口文件
./frameworks/base/core/java/android/os/PowerManager.java
PowerManager是个电源管理部分的基础类,拥有多个子类继承。
检查是否打开省电模式
注释部分翻译:如果设备当前处于省电模式则返回值为true。当设备处于此模式时,应用会尽可能的减少性能来达到增加电池续航的能力。用户可以通过监听事件ACTION_POWER_SAVE_MODE_CHANGED来获取设备状态。
方法返回值:处于省电模式返回true,否则false。
./frameworks/base/services/core/java/com/android/server/power/PowerManagerService.java
设置省电模式
释部分翻译:设置省电模式,如果允许设置(即设置成功)返回true,否则返回flase。
省电模式详细设置并发送广播及修改数据库
./frameworks/base/services/core/java/com/android/server/power/PowerManagerService.java
首先声明几个比较关键的全局变量:
mIsPowered变量表示充电状态,true表示正在充电(已接入电源),否则为false;
// If true, the device is in low power mode.
private boolean mLowPowerModeEnabled;
// Current state of the low power mode setting.
private boolean mLowPowerModeSetting;
// Current state of whether the settings are allowing auto low power mode.
private boolean mAutoLowPowerModeConfigured;
// The user turned off low power mode below the trigger level
private boolean mAutoLowPowerModeSnoozing;
// True if the battery level is currently considered low.
private boolean mBatteryLevelLow;
// True if theater mode is enabled
private boolean mTheaterModeEnabled;
mLowPowerModeSetting表示设置省电模式的当前状态,从系统设置中获取值,即数据库字段“low_power”的值是否为1的值,为1时表示处于省电模式,变量值为true;
/*
*if 1 low power mode enable
*数据库字段low_power的英文解释
*/
mAutoLowPowerModeConfigured表示省电模式是否允许自动设置省电模式,即数据库字段“low_power_trigger_level”是否为0的值;不为0时表示允许自动设置省电模式,该变量为true;
/*数据库字段low_trigger_level的注释
*Battery level [1-99]at which loe power mode autonmatically turns on
*if 0, it will not automatically turn on
*@hide
*/
mBatteryLevelLow表示电量是否处于低电量状态,是为true否则false;
mAutoLowPowerModeSnoozing表示电量低于省电模式触发点时,是否关闭省电模式,是为true,否则false;
该变量值是由mAutoLowPowerModeConfigured和mBatteryLevelLow这两个变量决定的。当电量低并且允许自动设置省电模式时,如果此时省电模式是开启的,就要设置mAutoLowPowerModeSnoozing的值为false;如果省电模式是关闭的,就要设置mAutoLowPowerModeSnoozing的值为true。就是要求mAutoLowPowerModeSnoozing变量与省电模式的逻辑保持一致。
mLowPowerModeEnbaled表示设备是否处于省电模式,省电模式下为true,否则flase;
修改数据库表示省电状态字段
SetLowPowerModeInternal()方法:
private boolean setLowPowerModeInternal(boolean mode) {
synchronized (mLock) {
if (DEBUG) Slog.d(TAG, "setLowPowerModeInternal " + mode + " mIsPowered=" + mIsPowered);
/*
*mIsPowered判断设备是否充电,充电状态下默认不能开启省电模式。
* */
if (mIsPowered) {
return false;
}
/*
*修改数据库中表示省电模式状态的字段low_power,将其字段根据mode值设为1或者0.
* 1 代表开启,0 代表关闭省电模式。
* */
Settings.Global.putInt(mContext.getContentResolver(),
Settings.Global.LOW_POWER_MODE, mode ? 1 : 0);
mLowPowerModeSetting = mode;
if (mAutoLowPowerModeConfigured && mBatteryLevelLow) {
if (mode && mAutoLowPowerModeSnoozing) {
if (DEBUG_SPEW) {
Slog.d(TAG, "setLowPowerModeInternal: clearing low power mode snooze");
}
mAutoLowPowerModeSnoozing = false;
} else if (!mode && !mAutoLowPowerModeSnoozing) {
if (DEBUG_SPEW) {
Slog.d(TAG, "setLowPowerModeInternal: snoozing low power mode");
}
mAutoLowPowerModeSnoozing = true;
}
}
updateLowPowerModeLocked();
return true;
}
}
发送开启省电模式广播
updateLowPowerModeLocked()方法:
void updateLowPowerModeLocked() {
if (mIsPowered && mLowPowerModeSetting) {//设备正在充电并且已经开启省电模式
if (DEBUG_SPEW) {
Slog.d(TAG, "updateLowPowerModeLocked: powered, turning setting off");
}
// Turn setting off if powered
//修改数据库中代表省电模式状态的字段“low_power”,将字段值设置为0,即关闭省电模式
Settings.Global.putInt(mContext.getContentResolver(),
Settings.Global.LOW_POWER_MODE, 0);
mLowPowerModeSetting = false;
}
/*
* 临时变量:autoLowPowerModeEnabled。
* 当前没有充电,自动开启省电模式,电量低于省电模式的电量触发点时不关闭省电模式,电池电量低,以上条件均满足时为true。
* */
final boolean autoLowPowerModeEnabled = !mIsPowered && mAutoLowPowerModeConfigured
&& !mAutoLowPowerModeSnoozing && mBatteryLevelLow;
/*
* 临时变量:lowPowerModeEnabled。
* 当mLowPowerModeSetting或autoLowPowerModeEnabled为真时,则设置为true。
* */
final boolean lowPowerModeEnabled = mLowPowerModeSetting || autoLowPowerModeEnabled;
/*
* 根据lowPowerModeEnabled临时变量值和mLowPowerModeEnabled(true表示设备处于省电模式,全局变量)
* 判断是否执行省电模式的功能。当两者状态不一致时,更新mLowPowerModeEnabled状态值。
* */
if (mLowPowerModeEnabled != lowPowerModeEnabled) {
mLowPowerModeEnabled = lowPowerModeEnabled;
powerHintInternal(POWER_HINT_LOW_POWER, lowPowerModeEnabled ? 1 : 0);
/*
* 使用后台线程BackgroundThread处理事件,会先后发送action为ACTION_POWER_SAVE_MODE_CHANGING和
* ACTION_POWER_SAVE_MODE_CHANGED的广播。
* */
BackgroundThread.getHandler().post(new Runnable() {
@Override
public void run() {
Intent intent = new Intent(PowerManager.ACTION_POWER_SAVE_MODE_CHANGING)
.putExtra(PowerManager.EXTRA_POWER_SAVE_MODE, mLowPowerModeEnabled)
.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);//只有动态定义的广播接收器才能接收到该广播
mContext.sendBroadcast(intent);
ArrayList listeners;
synchronized (mLock) {
listeners = new ArrayList(
mLowPowerModeListeners);
}
for (int i=0; i
listeners.get(i).onLowPowerModeChanged(lowPowerModeEnabled);
}
intent = new Intent(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED);
intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);//只有动态定义的广播接收器才能接收到该广播
mContext.sendBroadcast(intent);
}
});
}
}