powerUI会监听一些事件,如果收到监听的时间则用Notification 在systemUI显示通知
我们知道会在SystemUIApplication.java 中的startServiceIfNeed 函数中调用每一个service的start函数,我们下来看看systemUI中的powerUI的实现.
首先来看看start函数
60 public void start() {
61 mPowerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
62 mScreenOffTime = mPowerManager.isScreenOn() ? -1 : SystemClock.elapsedRealtime();
63 mWarnings = new PowerNotificationWarnings(mContext, getComponent(PhoneStatusBar.class));
64
65 ContentObserver obs = new ContentObserver(mHandler) {
66 @Override
67 public void onChange(boolean selfChange) {
68 updateBatteryWarningLevels();
69 }
70 };
71 final ContentResolver resolver = mContext.getContentResolver();
72 resolver.registerContentObserver(Settings.Global.getUriFor(
73 Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL),
74 false, obs, UserHandle.USER_ALL);
75 updateBatteryWarningLevels();
76 mReceiver.init();
77 }
在61上得到powerManager。主要用于在62行得到屏幕关闭的时间,以及后面判断是否进入powerSaveMode
148 setSaverMode(mPowerManager.isPowerSaveMode());
在63行得到一个WarningsUI 类型的mWanings,只要用于在状态栏显示当前的power状态
从65~75行注册一个contentObserver 用于检测 Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL的变化,如果变化则调用updateBatteryWarningLevels 更新waninglevels
我们来看看updateBatteryWarningLevels的实现.
83 void updateBatteryWarningLevels() {
84 int critLevel = mContext.getResources().getInteger(
85 com.android.internal.R.integer.config_criticalBatteryWarningLevel);
86
87 final ContentResolver resolver = mContext.getContentResolver();
88 int defWarnLevel = mContext.getResources().getInteger(
89 com.android.internal.R.integer.config_lowBatteryWarningLevel);
90 int warnLevel = Settings.Global.getInt(resolver,
91 Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL, defWarnLevel);
92 if (warnLevel == 0) {
93 warnLevel = defWarnLevel;
94 }
95 if (warnLevel < critLevel) {
96 warnLevel = critLevel;
97 }
98
99 mLowBatteryReminderLevels[0] = warnLevel;
100 mLowBatteryReminderLevels[1] = critLevel;
101 mLowBatteryAlertCloseLevel = mLowBatteryReminderLevels[0]
102 + mContext.getResources().getInteger(
103 com.android.internal.R.integer.config_lowBatteryCloseWarningBump);
104 }
这个函数会将warnLevel,critLevel,放到mLowBatteryReminderLevels 数组,并更新mLowBatteryAlertCloseLevel 。
最后在start函数的76行调用
76 mReceiver.init();
而mReceiver 是在下面赋值的
private final Receiver mReceiver = new Receiver();
那我们再来看看Receiver 的实现
132 private final class Receiver extends BroadcastReceiver {
133
134 public void init() {
135 // Register for Intent broadcasts for...
136 IntentFilter filter = new IntentFilter();
137 filter.addAction(Intent.ACTION_BATTERY_CHANGED);
138 filter.addAction(Intent.ACTION_SCREEN_OFF);
139 filter.addAction(Intent.ACTION_SCREEN_ON);
140 filter.addAction(Intent.ACTION_USER_SWITCHED);
141 filter.addAction(PowerManager.ACTION_POWER_SAVE_MODE_CHANGING);
142 filter.addAction(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED);
143 mContext.registerReceiver(this, filter, null, mHandler);
144 updateSaverMode();
145 }
146
147 private void updateSaverMode() {
148 setSaverMode(mPowerManager.isPowerSaveMode());
149 }
150
151 @Override
152 public void onReceive(Context context, Intent intent) {
153 String action = intent.getAction();
154 if (action.equals(Intent.ACTION_BATTERY_CHANGED)) {
201 mWarnings.showLowBatteryWarning(playSound);
202 } else if (plugged || (bucket > oldBucket && bucket > 0)) {
203 mWarnings.dismissLowBatteryWarning();
204 } else {
205 mWarnings.updateLowBatteryWarning();
206 }
207 } else if (Intent.ACTION_SCREEN_OFF.equals(action)) {
208 mScreenOffTime = SystemClock.elapsedRealtime();
209 } else if (Intent.ACTION_SCREEN_ON.equals(action)) {
210 mScreenOffTime = -1;
211 } else if (Intent.ACTION_USER_SWITCHED.equals(action)) {
212 mWarnings.userSwitched();
213 } else if (PowerManager.ACTION_POWER_SAVE_MODE_CHANGED.equals(action)) {
214 updateSaverMode();
215 } else if (PowerManager.ACTION_POWER_SAVE_MODE_CHANGING.equals(action)) {
216 setSaverMode(intent.getBooleanExtra(PowerManager.EXTRA_POWER_SAVE_MODE, false));
217 } else {
218 Slog.w(TAG, "unknown intent: " + intent);
219 }
220 }
221 };
Receiver 的init函数主要是注册一个监听事件的IntentFilter,当有我们监听的事件到来时会调动onReceive函数
我们以Intent.ACTION_USER_SWITCHED为例,看看mWarnings是如何在systemUI中更新通知的
mWarnings.userSwitched();
xref: /frameworks/base/packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java
344 @Override
345 public void userSwitched() {
346 updateNotification();
347 }
继续看updateNotification的实现
private void updateNotification() {
135 if (DEBUG) Slog.d(TAG, "updateNotification mWarning=" + mWarning + " mPlaySound="
136 + mPlaySound + " mSaver=" + mSaver + " mInvalidCharger=" + mInvalidCharger);
137 if (mInvalidCharger) {
138 showInvalidChargerNotification();
139 mShowing = SHOWING_INVALID_CHARGER;
140 } else if (mWarning) {
141 showWarningNotification();
142 mShowing = SHOWING_WARNING;
143 } else if (mSaver) {
144 showSaverNotification();
145 mShowing = SHOWING_SAVER;
146 } else {
147 mNoMan.cancelAsUser(TAG_NOTIFICATION, R.id.notification_power, UserHandle.ALL);
148 mShowing = SHOWING_NOTHING;
149 }
150 }
会看当前的电源的状态,我们mInvalidCharger=true为例
showInvalidChargerNotification();
152 private void showInvalidChargerNotification() {
153 final Notification.Builder nb = new Notification.Builder(mContext)
154 .setSmallIcon(R.drawable.ic_power_low)
155 .setWhen(0)
156 .setShowWhen(false)
157 .setOngoing(true)
158 .setContentTitle(mContext.getString(R.string.invalid_charger_title))
159 .setContentText(mContext.getString(R.string.invalid_charger_text))
160 .setPriority(Notification.PRIORITY_MAX)
161 .setVisibility(Notification.VISIBILITY_PUBLIC)
162 .setColor(mContext.getColor(
163 com.android.internal.R.color.system_notification_accent_color));
164 final Notification n = nb.build();
165 if (n.headsUpContentView != null) {
166 n.headsUpContentView.setViewVisibility(com.android.internal.R.id.right_icon, View.GONE);
167 }
168 mNoMan.notifyAsUser(TAG_NOTIFICATION, R.id.notification_power, n, UserHandle.ALL);
169 }
原来是通过Notification 来更新通知的.
我们知道会在SystemUIApplication.java 中的startServiceIfNeed 函数中调用每一个service的start函数,我们下来看看systemUI中的powerUI的实现.
首先来看看start函数
60 public void start() {
61 mPowerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
62 mScreenOffTime = mPowerManager.isScreenOn() ? -1 : SystemClock.elapsedRealtime();
63 mWarnings = new PowerNotificationWarnings(mContext, getComponent(PhoneStatusBar.class));
64
65 ContentObserver obs = new ContentObserver(mHandler) {
66 @Override
67 public void onChange(boolean selfChange) {
68 updateBatteryWarningLevels();
69 }
70 };
71 final ContentResolver resolver = mContext.getContentResolver();
72 resolver.registerContentObserver(Settings.Global.getUriFor(
73 Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL),
74 false, obs, UserHandle.USER_ALL);
75 updateBatteryWarningLevels();
76 mReceiver.init();
77 }
在61上得到powerManager。主要用于在62行得到屏幕关闭的时间,以及后面判断是否进入powerSaveMode
148 setSaverMode(mPowerManager.isPowerSaveMode());
在63行得到一个WarningsUI 类型的mWanings,只要用于在状态栏显示当前的power状态
从65~75行注册一个contentObserver 用于检测 Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL的变化,如果变化则调用updateBatteryWarningLevels 更新waninglevels
我们来看看updateBatteryWarningLevels的实现.
83 void updateBatteryWarningLevels() {
84 int critLevel = mContext.getResources().getInteger(
85 com.android.internal.R.integer.config_criticalBatteryWarningLevel);
86
87 final ContentResolver resolver = mContext.getContentResolver();
88 int defWarnLevel = mContext.getResources().getInteger(
89 com.android.internal.R.integer.config_lowBatteryWarningLevel);
90 int warnLevel = Settings.Global.getInt(resolver,
91 Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL, defWarnLevel);
92 if (warnLevel == 0) {
93 warnLevel = defWarnLevel;
94 }
95 if (warnLevel < critLevel) {
96 warnLevel = critLevel;
97 }
98
99 mLowBatteryReminderLevels[0] = warnLevel;
100 mLowBatteryReminderLevels[1] = critLevel;
101 mLowBatteryAlertCloseLevel = mLowBatteryReminderLevels[0]
102 + mContext.getResources().getInteger(
103 com.android.internal.R.integer.config_lowBatteryCloseWarningBump);
104 }
这个函数会将warnLevel,critLevel,放到mLowBatteryReminderLevels 数组,并更新mLowBatteryAlertCloseLevel 。
最后在start函数的76行调用
76 mReceiver.init();
而mReceiver 是在下面赋值的
private final Receiver mReceiver = new Receiver();
那我们再来看看Receiver 的实现
132 private final class Receiver extends BroadcastReceiver {
133
134 public void init() {
135 // Register for Intent broadcasts for...
136 IntentFilter filter = new IntentFilter();
137 filter.addAction(Intent.ACTION_BATTERY_CHANGED);
138 filter.addAction(Intent.ACTION_SCREEN_OFF);
139 filter.addAction(Intent.ACTION_SCREEN_ON);
140 filter.addAction(Intent.ACTION_USER_SWITCHED);
141 filter.addAction(PowerManager.ACTION_POWER_SAVE_MODE_CHANGING);
142 filter.addAction(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED);
143 mContext.registerReceiver(this, filter, null, mHandler);
144 updateSaverMode();
145 }
146
147 private void updateSaverMode() {
148 setSaverMode(mPowerManager.isPowerSaveMode());
149 }
150
151 @Override
152 public void onReceive(Context context, Intent intent) {
153 String action = intent.getAction();
154 if (action.equals(Intent.ACTION_BATTERY_CHANGED)) {
201 mWarnings.showLowBatteryWarning(playSound);
202 } else if (plugged || (bucket > oldBucket && bucket > 0)) {
203 mWarnings.dismissLowBatteryWarning();
204 } else {
205 mWarnings.updateLowBatteryWarning();
206 }
207 } else if (Intent.ACTION_SCREEN_OFF.equals(action)) {
208 mScreenOffTime = SystemClock.elapsedRealtime();
209 } else if (Intent.ACTION_SCREEN_ON.equals(action)) {
210 mScreenOffTime = -1;
211 } else if (Intent.ACTION_USER_SWITCHED.equals(action)) {
212 mWarnings.userSwitched();
213 } else if (PowerManager.ACTION_POWER_SAVE_MODE_CHANGED.equals(action)) {
214 updateSaverMode();
215 } else if (PowerManager.ACTION_POWER_SAVE_MODE_CHANGING.equals(action)) {
216 setSaverMode(intent.getBooleanExtra(PowerManager.EXTRA_POWER_SAVE_MODE, false));
217 } else {
218 Slog.w(TAG, "unknown intent: " + intent);
219 }
220 }
221 };
Receiver 的init函数主要是注册一个监听事件的IntentFilter,当有我们监听的事件到来时会调动onReceive函数
我们以Intent.ACTION_USER_SWITCHED为例,看看mWarnings是如何在systemUI中更新通知的
mWarnings.userSwitched();
xref: /frameworks/base/packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java
344 @Override
345 public void userSwitched() {
346 updateNotification();
347 }
继续看updateNotification的实现
private void updateNotification() {
135 if (DEBUG) Slog.d(TAG, "updateNotification mWarning=" + mWarning + " mPlaySound="
136 + mPlaySound + " mSaver=" + mSaver + " mInvalidCharger=" + mInvalidCharger);
137 if (mInvalidCharger) {
138 showInvalidChargerNotification();
139 mShowing = SHOWING_INVALID_CHARGER;
140 } else if (mWarning) {
141 showWarningNotification();
142 mShowing = SHOWING_WARNING;
143 } else if (mSaver) {
144 showSaverNotification();
145 mShowing = SHOWING_SAVER;
146 } else {
147 mNoMan.cancelAsUser(TAG_NOTIFICATION, R.id.notification_power, UserHandle.ALL);
148 mShowing = SHOWING_NOTHING;
149 }
150 }
会看当前的电源的状态,我们mInvalidCharger=true为例
showInvalidChargerNotification();
152 private void showInvalidChargerNotification() {
153 final Notification.Builder nb = new Notification.Builder(mContext)
154 .setSmallIcon(R.drawable.ic_power_low)
155 .setWhen(0)
156 .setShowWhen(false)
157 .setOngoing(true)
158 .setContentTitle(mContext.getString(R.string.invalid_charger_title))
159 .setContentText(mContext.getString(R.string.invalid_charger_text))
160 .setPriority(Notification.PRIORITY_MAX)
161 .setVisibility(Notification.VISIBILITY_PUBLIC)
162 .setColor(mContext.getColor(
163 com.android.internal.R.color.system_notification_accent_color));
164 final Notification n = nb.build();
165 if (n.headsUpContentView != null) {
166 n.headsUpContentView.setViewVisibility(com.android.internal.R.id.right_icon, View.GONE);
167 }
168 mNoMan.notifyAsUser(TAG_NOTIFICATION, R.id.notification_power, n, UserHandle.ALL);
169 }
原来是通过Notification 来更新通知的.