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
相关代码:
设置应用入口文件:
./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);
}
});
}
}
android+省电程序,Android5.1 系统之省电模式探索一启动流程相关推荐
- java计算机毕业设计基于安卓Android/微信小程序的自来水收费系统APP
项目介绍 网络的广泛应用给生活带来了十分的便利.所以把自来水收费管理与现在网络相结合,利用java技术建设自来水收费系统app,实现自来水收费的信息化.则对于进一步提高自来水收费管理发展,丰富自来水收 ...
- 智能电销外呼系统,帮助电销人员告别传统模式的低效
电话销售需要销售人员有着优秀的口头表达能力,在最短的时间传递给客户最重要的讯息,通常企业会对销售人员进行培训,以保证电销效率不掉线.但不管怎么进行口头表达和话术上的培训,传统电销模式业务开展效率低下, ...
- linux系统从开机到登录之前的启动流程
Linux系统从开机到登录之前的启动流程 1.开机BIOS自检 接通电源开机,计算机会先加载BIOS信息,因为BIOS中包含了CPU的相关信息,设备启动顺序信息 ,硬盘信息,内存信息,时钟信息,pnp ...
- Android系统(244)---Zygote进程的启动流程
Android进程系列第二篇---Zygote进程的启动流程 内容预览.png 概述: 本文(基于Android O源码)主要讲解Zygote进程创建流程,线程容易创建,但进程的相关的东西都被系统很好 ...
- Android 系统(246)---SystemServer进程的启动流程
Android进程系列第四篇---SystemServer进程的启动流程 一.内容预览 内容预览.png 二.概述 前面进程系列已经更新了三篇,本文(基于Android O源码),第三篇中System ...
- python-nodejs基于安卓Android/微信小程序的自来水收费系统APP
考虑到实际生活中在自来水收费管理方面的需要以及对该系统认真的分析,将系统权限按管理员.员工和用户这三类涉及用户划分. (1)用户功能需求 用户进入app可以实现首页.公告信息.我的等,在我的页面可以对 ...
- Android 从应用程序跳到系统应用管理和应用的权限管理页面
今天给app添加权限,当用户禁止后会弹出alert提示用户,咱们这个app需要这个权限 没这个权限app的一些功能就不能使了,但用户已经关了 也不知道在哪打开 所以加个去设置的按钮 点击然后跳到系统应 ...
- 台电tbook10s删除安卓系统_台电Tbook10S双系统 使用操作教程
本帖最后由 无效的sim卡 于 2016-12-21 10:05 编辑 完整图文介绍链接:请点击 台电平板交流QQ群 546263572 一.Win10首次开机有设置步骤,建议先跳过Wifi连接,进入 ...
- 电销外呼系统,智能电销系统哪家好?
现在市面上流通着一种高频防封电话卡,宣传说电销不封卡不封号,实际上都是商家的营销话术,现在无论什么手机号卡频繁高频外呼,都很难做到不会被封.目前95%的封号原因是高频,5%是投诉. 那么手机号卡.电销 ...
最新文章
- 研发流程在敏捷开发中的详解
- mysql的隔离级别_MySQL的四种事务隔离级别
- linux 添加用户并指定shell类型
- JVM—方法区到底是怎么保存函数方法的?
- 并不是每个女生都能穿出这种效果......
- win7下oracle10g安装,专门针对win7下oracle10g安装的详解
- JProfiler 简要使用说明
- (原创)如何解决matlab乱码问题
- 基础总结篇之六:ContentProvider之读写联系人
- [UE4]增加机器人
- linux 基础——常见命令及问题
- 群晖6.1安装php3.6_黑群晖 DSM6.1安装简明教程(附下载)
- BUUCTF misc 解题记录 一(超级详细)
- windriver 自动生成pcie驱动
- Windows update 注册表项
- 【office2010】利用尾注添加参考文献
- 计算机组成原理最难的是,计算机组成原理最后冲刺重难点梳理_跨考网
- 怎么把图片转换成BMP格式
- factorial of n
- P2698 [USACO12MAR]Flowerpot S 题解
热门文章
- 高德地图AMap.Map is not a constructor
- CNC数控编程、加工中心讲解原理
- POJ4124伟大的航线
- 升职加薪的方法很简单,但做起来很难,兼说我新工作转正后的初心
- 台达ASDA-B3 CAN总线位置模式简单通信
- 谷歌招聘新员工五大标准:文凭一边玩去
- 【观察】中小企业智慧化新路径,SAP的再创新与再突破
- 软件测试开发的工作内容以及如何自学软件测试
- 【ClickHouse】row_number() over (partition by)的几种实现方法
- Java Spring+Ehcache,完成配置后缓存失效问题