SystemUI PoweUI笔记
来源:互联网 发布:白左圣母毁灭欧洲 知乎 编辑:程序博客网 时间:2024/06/01 11:24
private final Receiver mReceiver = new Receiver();
//PowerUI:电源管理,继承SystemUI,调用start方法启动
public void start() {
//获取PowerManager对象,该类主要用于控制电源状态,处理和power相关的业务
mPowerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);‘
//初始化关屏时间,关屏时间会持续刷新
mScreenOffTime = mPowerManager.isScreenOn() ? -1 : SystemClock.elapsedRealtime();
//实例化PowerNotificationWarnings,Power相关的事件会通过Notification方式进行处理
mWarnings = new PowerNotificationWarnings(mContext, getComponent(PhoneStatusBar.class));
//监控电池电量,电量不足时会发出警告
ContentObserver obs = new ContentObserver(mHandler) {
@Override
public void onChange(boolean selfChange) {
updateBatteryWarningLevels();
}
};
final ContentResolver resolver = mContext.getContentResolver();
//监听LOW_POWER_MODE_TRIGGER_LEVEL的变化
resolver.registerContentObserver(Settings.Global.getUriFor(
Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL),
false, obs, UserHandle.USER_ALL);
//更新电池电量等级
updateBatteryWarningLevels();
//对Receiver进行初始化
mReceiver.init();
}
//更新电池电量等级
void updateBatteryWarningLevels() {
//电池电量有三个关键词:config_criticalBatteryWarningLevel=5,
//config_lowBatteryWarningLevel=15
//config_lowBatteryCloseWarningBump=5
//获取三个电量等级
int critLevel = mContext.getResources().getInteger(
com.android.internal.R.integer.config_criticalBatteryWarningLevel);
final ContentResolver resolver = mContext.getContentResolver();
int defWarnLevel = mContext.getResources().getInteger(
com.android.internal.R.integer.config_lowBatteryWarningLevel);
int warnLevel = Settings.Global.getInt(resolver,
Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL, defWarnLevel);
if (warnLevel == 0) {
warnLevel = defWarnLevel;
}
if (warnLevel < critLevel) {
warnLevel = critLevel;
}
mLowBatteryReminderLevels[0] = warnLevel;
mLowBatteryReminderLevels[1] = critLevel;
mLowBatteryAlertCloseLevel = mLowBatteryReminderLevels[0]
+ mContext.getResources().getInteger(
com.android.internal.R.integer.config_lowBatteryCloseWarningBump);
}
//对receiver进行初始化
public void init() {
IntentFilter filter = new IntentFilter();
//监听电量的变化
filter.addAction(Intent.ACTION_BATTERY_CHANGED);
filter.addAction(Intent.ACTION_SCREEN_OFF);
filter.addAction(Intent.ACTION_SCREEN_ON);
filter.addAction(Intent.ACTION_USER_SWITCHED);
filter.addAction(PowerManager.ACTION_POWER_SAVE_MODE_CHANGING);
filter.addAction(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED);
mContext.registerReceiver(this, filter, null, mHandler);
//查询当时是否是省电模式,并给出Notification通知
updateSaverMode();
}
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
//更新mBatteryLevel,mBatteryStatus,mPlugType,mInvalidCharger
if (action.equals(Intent.ACTION_BATTERY_CHANGED)) {
final int oldBatteryLevel = mBatteryLevel;
mBatteryLevel = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 100);
final int oldBatteryStatus = mBatteryStatus;
mBatteryStatus = intent.getIntExtra(BatteryManager.EXTRA_STATUS,
BatteryManager.BATTERY_STATUS_UNKNOWN);
final int oldPlugType = mPlugType;
mPlugType = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, 1);
final int oldInvalidCharger = mInvalidCharger;
mInvalidCharger = intent.getIntExtra(BatteryManager.EXTRA_INVALID_CHARGER, 0);
final boolean plugged = mPlugType != 0;
final boolean oldPlugged = oldPlugType != 0;
int oldBucket = findBatteryLevelBucket(oldBatteryLevel);
int bucket = findBatteryLevelBucket(mBatteryLevel);
...
mWarnings.update(mBatteryLevel, bucket, mScreenOffTime);
if (oldInvalidCharger == 0 && mInvalidCharger != 0) {
Slog.d(TAG, "showing invalid charger warning");
mWarnings.showInvalidChargerWarning();
return;
} else if (oldInvalidCharger != 0 && mInvalidCharger == 0) {
mWarnings.dismissInvalidChargerWarning();
} else if (mWarnings.isInvalidChargerWarningShowing()) {
// if invalid charger is showing, don't show low battery
return;
}
if (!plugged
&& (bucket < oldBucket || oldPlugged)
&& mBatteryStatus != BatteryManager.BATTERY_STATUS_UNKNOWN
&& bucket < 0) {
// only play SFX when the dialog comes up or the bucket changes
final boolean playSound = bucket != oldBucket || oldPlugged;
mWarnings.showLowBatteryWarning(playSound);
} else if (plugged || (bucket > oldBucket && bucket > 0)) {
mWarnings.dismissLowBatteryWarning();
} else {
mWarnings.updateLowBatteryWarning();
}
} else if (Intent.ACTION_SCREEN_OFF.equals(action)) {
mScreenOffTime = SystemClock.elapsedRealtime();
} else if (Intent.ACTION_SCREEN_ON.equals(action)) {
mScreenOffTime = -1;
} else if (Intent.ACTION_USER_SWITCHED.equals(action)) {
mWarnings.userSwitched();
} else if (PowerManager.ACTION_POWER_SAVE_MODE_CHANGED.equals(action)) {
updateSaverMode();
} else if (PowerManager.ACTION_POWER_SAVE_MODE_CHANGING.equals(action)) {
setSaverMode(intent.getBooleanExtra(PowerManager.EXTRA_POWER_SAVE_MODE, false));
} else {
Slog.w(TAG, "unknown intent: " + intent);
}
}
PowerNotificationWarnings.java(通过Notification处理power相关的函数)
private void updateNotification() {
...
if (mInvalidCharger) {
showInvalidChargerNotification();
mShowing = SHOWING_INVALID_CHARGER;
} else if (mWarning) {
showWarningNotification();
mShowing = SHOWING_WARNING;
} else if (mSaver) {
showSaverNotification();
mShowing = SHOWING_SAVER;
} else {
mNoMan.cancelAsUser(TAG_NOTIFICATION, R.id.notification_power, UserHandle.ALL);
mShowing = SHOWING_NOTHING;
}
}
//PowerUI:电源管理,继承SystemUI,调用start方法启动
public void start() {
//获取PowerManager对象,该类主要用于控制电源状态,处理和power相关的业务
mPowerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);‘
//初始化关屏时间,关屏时间会持续刷新
mScreenOffTime = mPowerManager.isScreenOn() ? -1 : SystemClock.elapsedRealtime();
//实例化PowerNotificationWarnings,Power相关的事件会通过Notification方式进行处理
mWarnings = new PowerNotificationWarnings(mContext, getComponent(PhoneStatusBar.class));
//监控电池电量,电量不足时会发出警告
ContentObserver obs = new ContentObserver(mHandler) {
@Override
public void onChange(boolean selfChange) {
updateBatteryWarningLevels();
}
};
final ContentResolver resolver = mContext.getContentResolver();
//监听LOW_POWER_MODE_TRIGGER_LEVEL的变化
resolver.registerContentObserver(Settings.Global.getUriFor(
Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL),
false, obs, UserHandle.USER_ALL);
//更新电池电量等级
updateBatteryWarningLevels();
//对Receiver进行初始化
mReceiver.init();
}
//更新电池电量等级
void updateBatteryWarningLevels() {
//电池电量有三个关键词:config_criticalBatteryWarningLevel=5,
//config_lowBatteryWarningLevel=15
//config_lowBatteryCloseWarningBump=5
//获取三个电量等级
int critLevel = mContext.getResources().getInteger(
com.android.internal.R.integer.config_criticalBatteryWarningLevel);
final ContentResolver resolver = mContext.getContentResolver();
int defWarnLevel = mContext.getResources().getInteger(
com.android.internal.R.integer.config_lowBatteryWarningLevel);
int warnLevel = Settings.Global.getInt(resolver,
Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL, defWarnLevel);
if (warnLevel == 0) {
warnLevel = defWarnLevel;
}
if (warnLevel < critLevel) {
warnLevel = critLevel;
}
mLowBatteryReminderLevels[0] = warnLevel;
mLowBatteryReminderLevels[1] = critLevel;
mLowBatteryAlertCloseLevel = mLowBatteryReminderLevels[0]
+ mContext.getResources().getInteger(
com.android.internal.R.integer.config_lowBatteryCloseWarningBump);
}
//对receiver进行初始化
public void init() {
IntentFilter filter = new IntentFilter();
//监听电量的变化
filter.addAction(Intent.ACTION_BATTERY_CHANGED);
filter.addAction(Intent.ACTION_SCREEN_OFF);
filter.addAction(Intent.ACTION_SCREEN_ON);
filter.addAction(Intent.ACTION_USER_SWITCHED);
filter.addAction(PowerManager.ACTION_POWER_SAVE_MODE_CHANGING);
filter.addAction(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED);
mContext.registerReceiver(this, filter, null, mHandler);
//查询当时是否是省电模式,并给出Notification通知
updateSaverMode();
}
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
//更新mBatteryLevel,mBatteryStatus,mPlugType,mInvalidCharger
if (action.equals(Intent.ACTION_BATTERY_CHANGED)) {
final int oldBatteryLevel = mBatteryLevel;
mBatteryLevel = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 100);
final int oldBatteryStatus = mBatteryStatus;
mBatteryStatus = intent.getIntExtra(BatteryManager.EXTRA_STATUS,
BatteryManager.BATTERY_STATUS_UNKNOWN);
final int oldPlugType = mPlugType;
mPlugType = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, 1);
final int oldInvalidCharger = mInvalidCharger;
mInvalidCharger = intent.getIntExtra(BatteryManager.EXTRA_INVALID_CHARGER, 0);
final boolean plugged = mPlugType != 0;
final boolean oldPlugged = oldPlugType != 0;
int oldBucket = findBatteryLevelBucket(oldBatteryLevel);
int bucket = findBatteryLevelBucket(mBatteryLevel);
...
mWarnings.update(mBatteryLevel, bucket, mScreenOffTime);
if (oldInvalidCharger == 0 && mInvalidCharger != 0) {
Slog.d(TAG, "showing invalid charger warning");
mWarnings.showInvalidChargerWarning();
return;
} else if (oldInvalidCharger != 0 && mInvalidCharger == 0) {
mWarnings.dismissInvalidChargerWarning();
} else if (mWarnings.isInvalidChargerWarningShowing()) {
// if invalid charger is showing, don't show low battery
return;
}
if (!plugged
&& (bucket < oldBucket || oldPlugged)
&& mBatteryStatus != BatteryManager.BATTERY_STATUS_UNKNOWN
&& bucket < 0) {
// only play SFX when the dialog comes up or the bucket changes
final boolean playSound = bucket != oldBucket || oldPlugged;
mWarnings.showLowBatteryWarning(playSound);
} else if (plugged || (bucket > oldBucket && bucket > 0)) {
mWarnings.dismissLowBatteryWarning();
} else {
mWarnings.updateLowBatteryWarning();
}
} else if (Intent.ACTION_SCREEN_OFF.equals(action)) {
mScreenOffTime = SystemClock.elapsedRealtime();
} else if (Intent.ACTION_SCREEN_ON.equals(action)) {
mScreenOffTime = -1;
} else if (Intent.ACTION_USER_SWITCHED.equals(action)) {
mWarnings.userSwitched();
} else if (PowerManager.ACTION_POWER_SAVE_MODE_CHANGED.equals(action)) {
updateSaverMode();
} else if (PowerManager.ACTION_POWER_SAVE_MODE_CHANGING.equals(action)) {
setSaverMode(intent.getBooleanExtra(PowerManager.EXTRA_POWER_SAVE_MODE, false));
} else {
Slog.w(TAG, "unknown intent: " + intent);
}
}
PowerNotificationWarnings.java(通过Notification处理power相关的函数)
private void updateNotification() {
...
if (mInvalidCharger) {
showInvalidChargerNotification();
mShowing = SHOWING_INVALID_CHARGER;
} else if (mWarning) {
showWarningNotification();
mShowing = SHOWING_WARNING;
} else if (mSaver) {
showSaverNotification();
mShowing = SHOWING_SAVER;
} else {
mNoMan.cancelAsUser(TAG_NOTIFICATION, R.id.notification_power, UserHandle.ALL);
mShowing = SHOWING_NOTHING;
}
}
阅读全文
0 0
- SystemUI PoweUI笔记
- systemui 学习笔记一
- SystemUi音量显示笔记
- SystemUI笔记 SystemBars
- SystemUI
- SystemUI
- SystemUI 7.0学习笔记三-QSPanel
- SystemUI 7.0学习笔记四-Recents
- SystemUI 7.0学习笔记二-状态栏和导航栏
- Android笔记(七)SystemUI通知栏框架
- Android笔记(十)Android O SystemUI启动流程
- android systemui
- SystemUI 概述
- SystemUI 概述
- 打包systemUI
- Android: SystemUI
- SystemUI->截屏
- SystemUI浅析
- Mybatis返回值问题
- CIE 颜色空间
- 三招教你div垂直居中
- Linux 下十大命令行下载工具
- 聊聊我最近的面试感受
- SystemUI PoweUI笔记
- CentOS7下Hbase分布式环境搭建
- 解决 Python shell 中 Delete/Backspace 键乱码问题以及自动补全问题
- 《2016-2017年全球竞争力报告》述评
- 财富杂志推荐的75本必读书
- 高通Qualcomm平台lk(light kernel)启动流程2——aboot_init()
- ActiveMQ监控队列状态报javax.management.InstanceNotFoundException
- Oratop工具_实时数据库性能监控工具
- java 获取 T.class