system ui powerUI

来源:互联网 发布:sai软件官方下载 编辑:程序博客网 时间:2024/05/21 04:39
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 来更新通知的.
0 0
原创粉丝点击