A brief analysis of Android6.0 SystemUI startup and icon display refresh

SystemUI of Android system includes status bar, navigation bar, shortcut settings, notification bar and lock screen interface, etc.; the main process starts with SystemUIService.
First start the SystemUIService service in SystemServer.java ;


Execute to the onCreate() method of SystemUIService:


Call the startServicesIfNeeded() method of SystemUIApplication;

In the startServicesIfNeeded() method, the related SystemUi type subclass objects will be started in turn;
The SERVICES[] array is:


Take SystemBar as an example:

After starting SystemBars, the internal start() method will detect whether there is a custom bar service; if not,
Will call back onNoService() method, and then call createStatusBarFromConfig() method;


R.string.config_statusBarComponent in this method ===> 
<string name="config_statusBarComponent" translatable="false"> com.android.systemui.statusbar.phone.PhoneStatusBar</string>
That is, this method is essentially used to load and start PhoneStatusBar;


PhoneStatusBar的start()方法又会去调用其父类BaseStatuBar的start()方法;
在BaseStatuBar的start()方法抽象方法createAndAddWindows(),而这个抽象方法是在BaseStatuBar的子类实现,例如在PhoneStatusBar中内部被实现,即实质上调用createAndAddWindows()方法。往下分析,同样的addIcon()方法也是如此;


调用 PhoneStatusBar的createAndAddWindows()方法, 调用addStatusBarWindow,继续往下调用makeStatusBarView()方法;


此方法主要作用就是构造statusBar的view,一步步往下分析:

定义StatusBarWindowView并未其设置触摸事件;
接下来的代码就是用来定义状态栏、导航栏、通知栏、锁屏区域、下拉扩展栏、快捷设置区域等等
而在PhoneStatusBar中也实现了addIcon()方法,用来实现Icon图标的加载;

执行完BaseStatuBar的start()方法之后,回到PhoneStatusBar的start()方法中,发现可以使用PhoneStatusBarPolicy来控制图标Icon;


PhoneStatusBarPolicy的构造方法

分析发现此构造方法主要是用来注册广播监听各种状态,如铃声、SIM卡等等状态来更新Icon的显示图形,最后通过调用
mService.setIcon()方法来设置显示出来;
mService是StatusBarManager的实现对象,通过aidl调用到StatusBarManagerService.java的方法setIcon()中,往下继续
使用StatusBarIconList.java的setIcon方法设置。而StatusBarIconList实质上一个数组集合,来对StatusBarIcon进行管理。

在android系统启动中,StatusBarManagerService是由SystemServer注册的


而在StatusBarManagerService的构造方法中,初始时是从config.xml中读取Icon solt的;

随着Android系统启动的不同层次,SystemUi也在不断启动,StatusBar也在不断加载启动。在BaseStatuBar中的start()方法
中,获取StatusBarManagerService对象,创建StatusBarIconList和CommandQueue的对象并将其传入StatusBarManagerService中; 在StatusBarManagerService中通过mBar(即传入的CommandQueue对象)进行一系列的命令操作。



CommandQueue,顾名思义是一个消息队列,用来接收来自于StatusBarManagerService的命令,而在CommandQueue中又通过发送msg到主线程中去使用callback回调执行相应的接口。
以StatusBarManagerService中的setIcon()方法为例:

调用mBar的setIcon()方法,即为CommandQueue.java的setIcon()方法

发送msg为OP_SET_ICON的消息通知主线程Handler执行

CallBack回调addIcon()或者updateIcon();
CommandQueue中的CallBack最终是由PhoneStatusBar来实现的,故最终的实现是由PhoneStatusBar来实现的。

图标显示刷新流程总结:
1、Android系统启动时,在SystemServer中会去注册StatusBarManagerService;
2、在StatusBarManagerService中的构造方法会去config.xml中读取Icon slot,并在StatusBarIconList集合中构造出相应长度的StatusBarIcon[]数组和将形参slot[]赋值给mSlots[];
3、随着Android系统的启动,StatusBar不断加载;通过调用BaseStatuBar的start()方法,去完成StatusBar的界面显示和初始图标的设置;
4、BaseStatuBar的start()主要是通过两个方法createAndAddWindows()和addIcon()方法来完成界面显示和初始图标设置,而这两个方法的主要实现是在其子类PhoneStatusBar.java中实现的;
5、BaseStatuBar的start()会获取StatusBarManagerService对象,创建StatusBarIconList和CommandQueue的对象并将其传入到StatusBarManagerService中;在StatusBarManagerService中通过mBar(即传入的CommandQueue对象)进行一系列的命令操作;
6、执行完BaseStatuBar的start()方法后,即回到PhoneStatusBar的start()方法中,在这个start()方法中会去构造一个PhoneStatusBarPolicy对象;主要是用来注册广播监听各种状态,如铃声、SIM卡等等状态变化来更新Icon的显示图形,最后通过调用
mService.setIcon()方法来设置显示出来;
7、而mService实质上是StatusBarManagerService的aidl调用,调用到StatusBarManagerService.java中的setIcon()方法;
8、在此方法中又会调用mBar.setIcon()方法去设置图标,而在前面我们知道mBar实质上值得是CommandQueue.java的对象,即调入CommandQueue.java中的setIcon()方法;此方法通过发送msg为OP_SET_ICON的消息通知主线程Handler执行,接下来通过Callback.addIcon()进行回调执行;
9、在CommandQueue.java的CallBack接口最终由PhoneStatusBar实现,即最终实现Icon的是在PhoneStatusBar.java的addIcon()方法内;
10、在addIcon()方法内调用mIconController.addSystemIcon()方法进入StatusBarIconController.java中的addSystemIcon()中执行。
至此完成StatusBar的显示更新。


Guess you like

Origin blog.csdn.net/Otaku_627/article/details/53525963