android5.1省电模式,Android5.1 系统之省电模式探索二设置通知

本文详细介绍了Android 5.1中PowerUI.java和PowerNotificationWarning.java组件如何响应省电模式状态变化,通过BroadcastReceiver处理电池状态和发送定制通知。内容包括电量解析、省电模式开关通知的创建与显示策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

此模块大量涉及到电量模块的变量及各种参数的判断,想要具体了解电量解析的可以参考另一名作者的博客:关于电池部分的相关详细内容请参考: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));//关闭省电模式

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值