系统栏启动流程分析
1.首先SystemServer 的ServerThread中创建了管理StatusBar的系统服务,调用addService将服务加入到系统服务表单中。以后就可以通过ServiceManager的getService方法来获取这个服务。
statusBar = new StatusBarManagerService(context, wm);
ServiceManager.addService(Context.STATUS_BAR_SERVICE, statusBar);
2. SystemServer在调用ActivityManagerService的systemReady方法时,传入了一个runnable参数,runnable执行时地用了startSystemUi()方法
static final void startSystemUi(Context context) {
Intent intent = new Intent();
intent.setComponent(new ComponentName("com.android.systemui",
"com.android.systemui.SystemUIService"));
context.startService(intent);
}
这个方法启动了SystemUIService服务。
3. SystemUIService启动后调用了onCreate方法
初始化SERVICES[]:
SERVICES[0] = wm.canStatusBarHide()
? R.string.config_statusBarComponent
: R.string.config_systemBarComponent;
执行结果:
SERVICES[0]=“com.android.systemui.statusbar.phone.PhoneStatusBar”
通过字符串找到这个类
Class cl = chooseClass(SERVICES[i]);
创建一个实例
mServices[i] = (SystemUI)cl.newInstance();
启动PhoneStatusBar
mServices[i].start();
4. PhoneStatusBar的start方法中首先调用了其父类StatusBar的start方法,然后将将NavigationBar添加到windowmanager中。PhoneStatusBarPolicy的创建是用来接受敏感事件,刷新状态栏。
super.start();
addNavigationBar();
mIconPolicy = new PhoneStatusBarPolicy(mContext);
5. StatusBar的是一个虚类,大部分方法都是在PhoneStatusBar实现的,但是在StatusBar的start方法中却做了很多工作。
首先调用makeStatusBarView(),初始化了所有的view。如果想详细了解每个部分,就有进相应的view进行分析,在这里不再多说。
然后向StatusBarManagerService注册回调。
mCommandQueue = new CommandQueue(this, iconList);
mBarService.registerStatusBar(mCommandQueue, iconList, notificationKeys, notifications,
switches, binders);