systemUI学习

来源:互联网 发布:武汉网络施工队 编辑:程序博客网 时间:2024/05/21 01:47

(1)StatusBarManagerService是状态栏的系统级服务代理,本章节中,它将外界(如StatusBarManager)对系统状态区图标的操作转发给运行在SystemUI进程中的状态栏。

(2)CommandQueue定义系统状态区图标的操作规范,并通过Callback接口将具体的操作实现在PhoneStatusBar中,同时在BaseStatusBar中通过注册的方式将mCommadQueue传递到StatusBarManagerService中,这样在StatusBarManagerService中关于系统状态区图标的操作才能同步到SystemUI中。

(3)PhoneStatusBar是对整个状态区图标的操作集合,本章节中只讨论系统状态区图标的相关流程。

(4)StatusBarIconController是将用状态区图标的控制类,其构造函数中包含状态区所有的图标ID

(5)PhoneStatusBarPolicy是用来开机初始化系统状态区图标,其通过监听系统状态相关的广播,以StatusBarManager为媒介,即通过StatusBarManagerService来到达初始化统状态区图标的目的。

接下来以开机加载闹钟为例,查看具体流程。

根据上述主要类的介绍,在PhoneStatusBarPolicy中监听系统状态相关的广播,如下:

 

其中关于闹钟的监听如下:

 

查看updateAlarm()方法:

 

其中mServiceStatusBarManager对象,在该类中,setIcon方法实现如下:

 

svcStatusBarManagerService的实例,在SystemService#startOtherServices()方法中将该实例加入到系统服务,如下:

 

而StatusBarManager#getService()如下:

 

故而svc.setIcon调用的是StatusBarManagerService中的setIcon方法,如下:

 

在StatusBarManagerService#setIcon方法中,enforceStatusBar()检查权限,而mIcons.getSlotIndex(slot)稍后再说,跳过看mBar.setIcon(index,icon);关于mBar,在介绍CommandQueue类的时候就说明了,mBarCommandQueue的实例,提供的是系统状态区图标操作的规范,在SystemUIBaseStatusBar#start()初始化中将该实例注册到StatusBarManagerService中,如下:

 

其中mBarServiceStatusBarManagerService实例,得到方法同StatusBarManager#getService()实现一致。

因此mBar.setIcon(index,icon)调用的是CommandQueue#setIcon(index,icon)方法,代码如下:

 

CommandQueue内部通过Handler消息处理,如下:

 

根据状态栏是否已有该图标来跟新或添加,来看添加过程,调用的是mCallbacks.addIcon(...)

但是mCallbacksCallbacks接口的实现对象,接下来查看其实现Callbacks接口的实现类。Callbacks定义在CommandQueue内部,并通过CommandQueue的构造函数方法将Callbacks接口的实现对象传递进来,而Callbacks接口的实现类是BaseStatusBar,但是该类是个抽象类,Callbacks接口的具体实现在BaseStatusBar的子类PhoneStatusBar中,在上述说明CommandQueue的初始化的时候,将PhoneStatusBar对象本身“this”传递给CommandQueue,因此mCallbacks.addIcon(...)调用的是PhoneStatusBar#addIcon,如下:

 

其中mIconControllerStatusBarIconController对象,该对象在文件开头主要类介绍中已大致说明其功能,其构造函数如下:

 

对应的是状态区各图标以及布局的IDaddSystemIcon方法如下:

 

其中mStatusIcons.addView就是往系统状态区添加图标,applyIconTint()方法是跟新相应View的状态,如下:

 

其中就有mClock,到此系统状态区添加图标的流程结束。接下来查看下StatusBarManagerService关于系统状态区图标的规范定义,前面在StatusBarManagerService#setIcon方法中提到mIcons.getSlotIndex(slot),其实涉及系统状态区图标的操作都会先通过mIcons.getSlotIndex(slot)来判断操作是否合规,应为系统转台区图标的类型在该类中都有定义,如下:

 

其中config_statusBarIcons数组资源位于frameworks/base/core/res/res/values/config.xml中,在<string-array>标签中定义的字符串数组资源:

 

可以在里面看到蓝牙、wifialarm等。slot表示的必须是上述图标类型的字符串,否则操作无效。

关于系统状态区图标的添加流程图如下: