android+省电程序,Android5.1 系统之省电模式探索一启动流程

文章主要参考网址: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

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

相关代码:

设置应用入口文件:

./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开启新线程开始省电模式,否则关闭省电模式。

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

新线程开启后主要执行trySetPowerSaveMode()方法。节电助手开启时参数为true,关闭时参数为false。

0818b9ca8b590ca3270a3433284dd417.png

提供调用接口文件

./frameworks/base/core/java/android/os/PowerManager.java

PowerManager是个电源管理部分的基础类,拥有多个子类继承。

检查是否打开省电模式

0818b9ca8b590ca3270a3433284dd417.png

注释部分翻译:如果设备当前处于省电模式则返回值为true。当设备处于此模式时,应用会尽可能的减少性能来达到增加电池续航的能力。用户可以通过监听事件ACTION_POWER_SAVE_MODE_CHANGED来获取设备状态。

方法返回值:处于省电模式返回true,否则false。

./frameworks/base/services/core/java/com/android/server/power/PowerManagerService.java

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

设置省电模式

0818b9ca8b590ca3270a3433284dd417.png

释部分翻译:设置省电模式,如果允许设置(即设置成功)返回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);

}

});

}

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值