PowerUI
powerUI是SystemUI显示电池相关信息的模块,包括低电量提醒,危急电量关机提醒,高温关机提醒,省电模式等的功能。
在powerUI.java 中主要是两个函数start()和onReveice()
启动流程
SystemUI启动时会加载众多功能模块,其中就包含着PowerUI,会直接调用\
PowerUI.start()
start() 函数是在PowerUI 中最先触发的方法。在方法内进行了一些赋值操作,及注册对电量变化和屏幕开闭状态的广播监听
1)实例化PowerManager,因为是处理和Power相关的业务,必须实例化PowerManager.
2)初始化关屏时间,关屏时间会持续刷新。
3)实例化PowerNotificationWarnings,Power相关的事件会通过Notification方式进行处理。
4)监控电池电量,在电量不足是给出警告和提示。
5)更新电池电量等级。
public void start() {
//获取PowerManager 用于获取电池的相关信息
mPowerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
//获取自启动以来的毫秒数
mScreenOffTime = mPowerManager.isScreenOn() ? -1 : SystemClock.elapsedRealtime();
mWarnings = Dependency.get(WarningsUI.class);
//和混合通知相关,相关功能平台默认是关闭的,我们暂时也就不关注了
mEnhancedEstimates = Dependency.get(EnhancedEstimates.class);
mLastConfiguration.setTo(mContext.getResources().getConfiguration());
// 监测低电量阀值的改变
ContentObserver obs = new ContentObserver(mHandler) {
@Override
public void onChange(boolean selfChange) {
updateBatteryWarningLevels();
}
};
final ContentResolver resolver = mContext.getContentResolver();
resolver.registerContentObserver(Settings.Global.getUriFor(
Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL),
false, obs, UserHandle.USER_ALL);
// 更新低电量等阀值
updateBatteryWarningLevels();
// 监听相关广播
mReceiver.init();
//检查我们是否需要让用户知道手机之前因温度过高而关闭
showWarnOnThermalShutdown();
// Register an observer to configure mEnableSkinTemperatureWarning and perform the
// registration of skin thermal event listener upon Settings change.
//注册观察者以配置 mEnableSkinTemperatureWarning 并在设置更改时执行皮肤热事件侦听器的注册。
resolver.registerContentObserver(
Settings.Global.getUriFor(Settings.Global.SHOW_TEMPERATURE_WARNING),
false /*notifyForDescendants*/,
new ContentObserver(mHandler) {
@Override
public void onChange(boolean selfChange) {
doSkinThermalEventListenerRegistration();
}
});
// Register an observer to configure mEnableUsbTemperatureAlarm and perform the
// registration of usb thermal event listener upon Settings change.
//注册观察者以配置 mEnableUsbTemperatureAlarm 并在设置更改时执行 USB 热事件侦听器的注册。
resolver.registerContentObserver(
Settings.Global.getUriFor(Settings.Global.SHOW_USB_TEMPERATURE_ALARM),
false /*notifyForDescendants*/,
new ContentObserver(mHandler) {
@Override
public void onChange(boolean selfChange) {
doUsbThermalEventListenerRegistration();
}
});
// 初始化温度阀值
initThermalEventListeners();
mCommandQueue.addCallback(this);
}
电池电量有三个关键值定义如下(frameworks\base\core\res\res\valuesconfig.xml):
<integer name="config_criticalBatteryWarningLevel">5</integer>
<integer name="config_lowBatteryWarningLevel">15</integer>
<integer name="config_lowBatteryCloseWarningBump">5</integer>
低电量警告
updateBatteryWarningLevels
void updateBatteryWarningLevels() {
//获取系统配置的危急电量,默认值是5
int critLevel = mContext.getResources().getInteger(
com.android.internal.R.integer.config_criticalBatteryWarningLevel);
// 获取系统配置的低电量值,默认:15
int warnLevel = mContext.getResources().getInteger(
com.android.internal.R.integer.config_lowBatteryWarningLevel);
if (warnLevel < critLevel) {
warnLevel = critLevel;
}
mLowBatteryReminderLevels[0] = warnLevel;
mLowBatteryReminderLevels[1] = critLevel;
// 获取系统配置的关闭低电量警告状态的电量值,默认:20(15+5)
mLowBatteryAlertCloseL