Un breve análisis del inicio de Android 6.0 SystemUI y la actualización de la pantalla de iconos

SystemUI del sistema Android incluye barra de estado, barra de navegación, configuración de accesos directos, barra de notificaciones e interfaz de pantalla de bloqueo, etc .; el proceso principal comienza con SystemUIService.
Primero inicie el servicio SystemUIService en SystemServer.java ;


Ejecute el método onCreate () de SystemUIService:


Llame al método startServicesIfNeeded () de SystemUIApplication;

En el método startServicesIfNeeded (), los objetos de subclase de tipo SystemUi relacionados se iniciarán a su vez;
La matriz de SERVICIOS [] es:


Tome SystemBar como ejemplo:

Después de iniciar SystemBars, el método interno start () detectará si hay un servicio de barra personalizado; si no,
Llamará al método onNoService () y luego llamará al método createStatusBarFromConfig ();


R.string.config_statusBarComponent en este método ===> 
<string name = "config_statusBarComponent" translatable = "false"> com.android.systemui.statusbar.phone.PhoneStatusBar </string>
Es decir, este método se usa esencialmente para cargar e iniciar 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的显示更新。


Supongo que te gusta

Origin blog.csdn.net/Otaku_627/article/details/53525963
Recomendado
Clasificación