此模块大量涉及到电量模块的变量及各种参数的判断,想要具体了解电量解析的可以参考另一名作者的博客:关于电池部分的相关详细内容请参考:http://blog.youkuaiyun.com/kc58236582/article/details/45564501
简介
android5.1开启省电模式后会自动发送notification到通知栏并且强制在锁屏时显示且不可去除,本模块主要讲解收到省电模式开启的广播时接收者如何发送notification。
主要涉及文件
./frameworks/base/packages/SystemUI/src/com/android/systemui/power/PowerUI.java
frameworks/base/packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarning.java
接收广播
首先powerUI.java中注册接收器
/*PowerUI.java 内部类Receiver用来接受电池变化的广播*/
private final class Receiver extends BroadcastReceiver {
public void init() {
// Register for Intent broadcasts for...
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);
updateSaverMode();
}
private void updateSaverMode() {
/*获取是否开启省电模式,并将返回值作为参数传递*/
setSaverMode(mPowerManager.isPowerSaveMode());
}
private void setSaverMode(boolean mode) {
/*调用PowerNotificationWarnnings.java的showSaverMode方法*/
mWarnings.showSaverMode(mode);//后期讲解方法用途
}接收到广播后的操作
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));
}
PowerNotificationWarning.java
由PowerUI.java中的mWarnings.showSaveMode()进入PowerNotificationWarning.java开始notification的相关设置判断。
@Override
public void showSaverMode(boolean mode) {
mSaver = mode;
/*mSaver 是否开启省电模式 */
if (mSaver && mSaverConfirmation != null) {
mSaverConfirmation.dismiss();
}
updateNotification();
}
private void updateNotification() {
if (DEBUG) Slog.d(TAG, "updateNotification mWarning=" + mWarning + " mPlaySound="
+ mPlaySound + " mSaver=" + mSaver + " mInvalidCharger=" + mInvalidCharger);
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, ID_NOTIFICATION, UserHandle.ALL);
mShowing = SHOWING_NOTHING;
}
}
private void showInvalidChargerNotification() {//本篇未涉及,不与解释
final Notification.Builder nb = new Notification.Builder(mContext)
.setSmallIcon(R.drawable.ic_power_low)
.setWhen(0)
.setShowWhen(false)
.setOngoing(true)
.setContentTitle(mContext.getString(R.string.invalid_charger_title))
.setContentText(mContext.getString(R.string.invalid_charger_text))
.setPriority(Notification.PRIORITY_MAX)
.setVisibility(Notification.VISIBILITY_PUBLIC)
.setColor(mContext.getResources().getColor(
com.android.internal.R.color.system_notification_accent_color));
final Notification n = nb.build();
if (n.headsUpContentView != null) {
n.headsUpContentView.setViewVisibility(com.android.internal.R.id.right_icon, View.GONE);
}
mNoMan.notifyAsUser(TAG_NOTIFICATION, ID_NOTIFICATION, n, UserHandle.ALL);
}
private void showWarningNotification() {//低电量警告
final int textRes = mSaver ? R.string.battery_low_percent_format_saver_started
: R.string.battery_low_percent_format;
final String percentage = NumberFormat.getPercentInstance().format((double) mBatteryLevel / 100.0);
final Notification.Builder nb = new Notification.Builder(mContext)
.setSmallIcon(R.drawable.ic_power_low)//低电量图标
// Bump the notification when the bucket dropped.
/*参数取电池变化值,buket表示电池变化系数,当电量小于警告值(15%)时bucket<0,并且随着电量逐渐减少bucket值也变小。
* 即电量低于警告值时,电量的变化率和bucket的变化率成正比关系
* if(buket>0),表示电量高于警告值(15%),不会发出低电量警告。
* */
.setWhen(mBucketDroppedNegativeTimeMs)//通知产生的时间
.setShowWhen(false)
.setContentTitle(mContext.getString(R.string.battery_low_title))
.setContentText(mContext.getString(textRes, percentage))
.setOnlyAlertOnce(true)
.setDeleteIntent(pendingBroadcast(ACTION_DISMISSED_WARNING))//低电量状态结束时才可删除
.setPriority(Notification.PRIORITY_MAX)
.setVisibility(Notification.VISIBILITY_PUBLIC)
.setColor(mContext.getResources().getColor(
com.android.internal.R.color.battery_saver_mode_color));
if (hasBatterySettings()) {
nb.setContentIntent(pendingBroadcast(ACTION_SHOW_BATTERY_SETTINGS));
}
if (!mSaver) {
nb.addAction(0,
mContext.getString(R.string.battery_saver_start_action),
pendingBroadcast(ACTION_START_SAVER));
} else {
addStopSaverAction(nb);
}
if (mPlaySound) {
attachLowBatterySound(nb);
mPlaySound = false;
}
final Notification n = nb.build();
if (n.headsUpContentView != null) {
n.headsUpContentView.setViewVisibility(com.android.internal.R.id.right_icon, View.GONE);
}
mNoMan.notifyAsUser(TAG_NOTIFICATION, ID_NOTIFICATION, n, UserHandle.ALL);
}
private void showSaverNotification() {//省电模式开启通知
final Notification.Builder nb = new Notification.Builder(mContext)
.setSmallIcon(R.drawable.ic_power_saver)
.setContentTitle(mContext.getString(R.string.battery_saver_notification_title))
.setContentText(mContext.getString(R.string.battery_saver_notification_text))
.setOngoing(true)
.setShowWhen(false)
.setVisibility(Notification.VISIBILITY_PUBLIC)
.setColor(mContext.getResources().getColor(
com.android.internal.R.color.battery_saver_mode_color));
addStopSaverAction(nb);//点击关闭省电模式
if (hasSaverSettings()) {
nb.setContentIntent(pendingActivity(mOpenSaverSettings));//点击直接跳转到省电模式设置界面
}
mNoMan.notifyAsUser(TAG_NOTIFICATION, ID_NOTIFICATION, nb.build(), UserHandle.ALL);
}
private void addStopSaverAction(Notification.Builder nb) {
nb.addAction(0,
mContext.getString(R.string.battery_saver_notification_action_text),
pendingBroadcast(ACTION_STOP_SAVER));//关闭省电模式
}