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()方法:
其中mService是StatusBarManager对象,在该类中,setIcon方法实现如下:
svc是StatusBarManagerService的实例,在SystemService#startOtherServices()方法中将该实例加入到系统服务,如下:
而StatusBarManager#getService()如下:
故而svc.setIcon调用的是StatusBarManagerService中的setIcon方法,如下:
在StatusBarManagerService#setIcon方法中,enforceStatusBar()检查权限,而mIcons.getSlotIndex(slot)稍后再说,跳过看mBar.setIcon(index,icon);关于mBar,在介绍CommandQueue类的时候就说明了,mBar是CommandQueue的实例,提供的是系统状态区图标操作的规范,在SystemUI的BaseStatusBar#start()初始化中将该实例注册到StatusBarManagerService中,如下:
其中mBarService是StatusBarManagerService实例,得到方法同StatusBarManager#getService()实现一致。
因此mBar.setIcon(index,icon)调用的是CommandQueue#setIcon(index,icon)方法,代码如下:
CommandQueue内部通过Handler消息处理,如下:
根据状态栏是否已有该图标来跟新或添加,来看添加过程,调用的是mCallbacks.addIcon(...),
但是mCallbacks是Callbacks接口的实现对象,接下来查看其实现Callbacks接口的实现类。Callbacks定义在CommandQueue内部,并通过CommandQueue的构造函数方法将Callbacks接口的实现对象传递进来,而Callbacks接口的实现类是BaseStatusBar,但是该类是个抽象类,Callbacks接口的具体实现在BaseStatusBar的子类PhoneStatusBar中,在上述说明CommandQueue的初始化的时候,将PhoneStatusBar对象本身“this”传递给CommandQueue,因此mCallbacks.addIcon(...)调用的是PhoneStatusBar#addIcon,如下:
其中mIconController是StatusBarIconController对象,该对象在文件开头主要类介绍中已大致说明其功能,其构造函数如下:
对应的是状态区各图标以及布局的ID,addSystemIcon方法如下:
其中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>标签中定义的字符串数组资源:
可以在里面看到蓝牙、wifi、alarm等。slot表示的必须是上述图标类型的字符串,否则操作无效。
关于系统状态区图标的添加流程图如下:
- systemUI学习
- systemui 学习笔记一
- SystemUI 5.0 学习日记
- SystemUI
- SystemUI
- [学习记录]SystemUI
- [学习记录]SystemUI
- SystemUI 7.0学习总结一-SystemUI的启动
- android setting laucher systemui 源码学习
- SystemUI 7.0学习笔记三-QSPanel
- SystemUI 7.0学习笔记四-Recents
- SystemUI 7.0学习笔记二-状态栏和导航栏
- android systemui
- SystemUI 概述
- SystemUI 概述
- 打包systemUI
- Android: SystemUI
- SystemUI->截屏
- lavarel的密码验证
- vim常用的命令
- vue动态组价实例
- https三次握手 4次断开
- 【Eternallyc】NEFU-118-n!后面有多少个0
- systemUI学习
- 基于SSM的RBAC权限系统(1)-利用ajax,bootstrap,ztree完成权限树功能
- Spire.Doc 教程:在C#,VB.NET创建、编辑和保存Word
- abaqus分析步
- CodeForces
- OpenStack组件Swift单机搭建
- MySql之三十六军规
- npm入门
- nginx 配置文件详解