SystemUI QuickSettings流程梳理
SystemUI之快捷设置Qs加载过程分析
一、布局构成
详细说明:
src\com\android\systemui\statusbar\phone\StatusBar.java
快捷设置区域的布局由 StatusBar.java的 makeStatusBarView ()统一加载,通过方法 inflateStatusBarWindow 方法加载布局 super_notification_shade.xml 。
super_notification_shade.xml 中包含 status_bar_expanded.xml;
status_bar_expanded.xml 中包含 qs_panel.xml -> id 为 quick_settings_panel 即为SystemUI 上的快捷设置区域控件id(</com.android.systemui.qs.QSContainerImpl>)
status_bar_expanded.xml即下拉菜单的布局文件。里面主要包含View:
1.@layout/keyguard_status_view 锁屏界面的View
2.@+id/qs_frame QS快捷面板
3.@+id/notification_stack_scroller 通知栏
二、代码控制流程
2.1、下拉菜单创建流程
2.1.1、QSFragment的创建
从 StatusBar.java的makeStatusBarView() 方法开始,这样@+id/qs_frame(@layout/qs_panel) 的界面的控制就被转移到QSFragment,相应的layout也就变成了qs_panel
2.1.2、qs_panel
- @+id/quick_settings_panel 快捷面板容器,布局风格
- @layout/quick_status_bar_expanded_header 这个layout也包含了一个快捷面板(单行),布局风格
2.1.3、tiles数据获取
一步步分析,首先先实例化一个 View ( qs_frame 包含一个 QSPanel 视图)对象,然后再去创建 QSTileHost 对象,然后将 QSTileHost 对象与 QSPanel 视图对象进行绑定,看一下 QSTileHost 的构造方法。使用 TunerService 去 Settings 中查询 key 为 TILES_SETTING 的值,即查询快捷设置菜单项,查询到的结果通过 onTuningChanged ()方法回调返回,TunerService 的实现类是 TunerServiceImpl 。
TunerServiceImpl.java
onTuningChanged 方法的实现在 QSTileHost 中,通过方法 loadTileSpecs 方法将 config.xml 中定义的标签内容 load 进来,通过 createTile 方法依次根据 xml中 的 String 生成对应的 Tile ,并将 Tile 保存在成员变量的 mTiles 集合中,最后回调 onTilesChanged ()方法,通知 QSPanel.java 对快捷设置选项显示更新。
SystemUI\src\com\android\systemui\qs\QSTileHost.java
QSTileHost.onTuningChanged
QSTileHost.loadTileSpecs :
QSTileHost.createTile
QSFactoryImpl.createTile
onTuningChanged这个函数的创建比QSFragment更早,所以数据提前已经准备好了。在loadTileSpecs函数里面有这一行 String defaultTileList = res.getString(R.string.quick_settings_tiles_default)获取我们需要加载在快捷面板上面的项目。依据defaultTileList 来createTile(tileSpec)创建对应的QSTile。至此数据创建完毕,后续就是数据的使用
2.1.4、数据获取后titles加载到页面
QuickQSPanelController.setTiles() --> QSPanelControllerBase.setTiles \ addTile --> mView.addTile --> QSPanel.addTile --> mTileLayout.addTile//加载到页面上
这段代码的工作有两个:1.由tile的数据创建QSTileView,并且保持在TileRecord。
2.把创建好的TileRecord 添加的快捷面板中 mTileLayout.addTile(r)。
2.2、快捷面板的加载
2.2.1、面板加载mTileLayout
QSPanel.java
PagedTileLayout extends ViewPager
此处通过ViewPager完成页面数据的加载……
2.3、添加tile
参考文章:SystemUI中QuickSettings增加截图按钮(基于Android Q) - 代码先锋网
主要流程有
1.首先Systemui中的res/values/config.xml添加,参考其他tile
quick_settings_tiles_default、quick_settings_tiles_stock
qs-tiles.md中解释如下:
第一个包含了SystemUI知道如何创建的所有tiles的列表(在定制屏幕中显示给用户)。第二个选项只包含用户在新启动或重置tiles后所体验到的默认tiles。
2.增加一个XxxTile.java(照猫画虎,参考其他的title)
3.最重要的是添加title的地方
src/com/android/systemui/qs/tileimpl/QSFactoryImpl.java —>createTileInternal()
2.4、三方应用添加tile
三方应用添加可参考下面文章:
SystemUI之第三方应用创建Tile到Qs
三、代码中常见部分相关类简介
1、QsDetail extends LinearLayout --quick setting中某一个setting打开后的状态,
比如battery或者情景模式设定打开后的详情状态
2、QuickQSPanel extends QSPanel 头部显示的快捷面板单行布局
3、QSPanel extends LinearLayout 展开时的快捷面板
View that represents the quick settings tile panel (when expanded/pulled down) 表示快速设置平铺面板的视图(展开/下拉时)
4、QSTileHost implements QSHost(interface QSHost) titles数据管理类
5、QSTileViewImpl : QSTileView(extends LinearLayout) 单个tile的view,包括文字、图标、颜色、布局位置等均在此处设置
6、CustomizeTileView : QSTileViewImpl(kt中父类)
其他一些关键类介绍可参考下面文章
SystemUI StatusBar和Notification代码浅析
参考资料:
SystemUI之快捷设置区域加载过程分析 - 程序员大本营
Android SystemUI之下拉菜单,通知栏,快捷面板(三)_肖岩-CSDN博客_android systemui 下拉菜单
https://www.codeleading.com/article/30873146526/
https://github.com/aosp-mirror?q=&type=&language=
SystemUI QuickSettings流程梳理相关推荐
- SystemUI StatusBar流程梳理
SystemUI之StatusBar状态栏 布局结构 下拉菜单.状态栏都是属于statusbar,结构树上也是属于顶层的super_status_bar.xml(StatusBarWindowView ...
- (四十四)Android O WiFi启动流程梳理
前言:最近又重新拿起来WiFi模块,从WiFi 各个流程梳理开始复习一下. 参考博客:https://blog.csdn.net/csdn_of_coder/article/details/51541 ...
- .16-浅析webpack源码之编译后流程梳理
这节把编译打包后的流程梳理一下,然后集中处理compile. 之前忽略了一个点,如下: new NodeEnvironmentPlugin().apply(compiler); // 引入插件加载 i ...
- 【EventBus】EventBus 源码解析 ( 注册订阅者总结 | EventBus 注册订阅者流程梳理 )
文章目录 EventBus 注册订阅者流程梳理 EventBus 注册订阅者流程梳理 EventBus 注册订阅者流程梳理 : ① 在 客户端 调用 EventBus.getDefault().reg ...
- 【Binder 机制】AIDL 分析 ( AIDL 通信完整流程梳理 )
文章目录 AIDL 跨进程通信完整流程梳理 1.AIDL 文件编译 2.注册服务 3.IMyAidlInterface.Stub.asInterface 方法获取远程服务 4.IMyAidlInter ...
- 在流程梳理的过程中,OA工作组应采用国际先进方法
进行OA服务建模 服务建模是通过对全部业务流程的全面分析,初步确定业务服务和应用服务,包括服务封装的业务/应用逻辑和对外提供的操作候选. 服务建模的前提是需对业务流程和系统功能非常了解.服务建模的工作 ...
- android p wifi一直在扫描_(一百六十八)Android P wifi 扫描失败结果上报流程梳理-扫描上报梳理②...
接(一百五十五)Android P wifi 扫描失败结果上报流程梳理-扫描上报梳理 扫描失败上报梳理发现梳理的差了很多,特补充 1.WificondScannerImpl @Override pub ...
- jeecg流程梳理学习
jeecg 流程梳理 角色 admin 管理员 fgld 学校分管领导 bgs 学校办公室 xbld 系部领导 xbky 系部科员 jxky bmld 部门领导 发文申请 applyUserId ad ...
- MFC 学习笔记(一):MFC单文档程序运行流程梳理与总结
MFC 学习笔记(一):MFC单文档程序运行流程梳理与总结 1.MFC单文档程序运行流程 1.首先利用全局变量对象 theApp 启动应用程序 (这是因为这个全局对象,基类CWinApp中 this ...
最新文章
- 4键电子手表说明书_家有破壁机的要收藏,教你4道早餐食谱,细腻香甜,比喝豆浆舒服...
- matlab基础与实例教程,MATLAB基础与实例教程
- Maven中安装本地Jar包到仓库中或将本地jar包上传
- 核心期刊投稿经验(遥感信息)
- rabbitmq监控queue中message数量
- 修改Windows登陆时显示上一次登陆的用户名
- g++是什么_路由器信号分为2.4G和5G,有什么区别?怎么选?
- 解压vmlinuz和解压initrd(initramfs)
- AD----如何将立创EDA元器件封装库导入AD库
- 2500个常用中文字符 + 130常用中英文字符
- java stream流处理
- C# 使用 Response 导出 Excel 单元格格式设置为文本格式
- 企业微信获取临时素材,此处接口为语音接口
- sql超键 候选键 主键
- 秒杀限制人群,如何设计秒杀服务的限流策略?
- 【githubshare】基于 C 语言编写的一款 2D 太空射击游戏,已在 Windows 10 和 Ubuntu Linux 16.04 系统上跑通测试
- 虚函数、纯虚函数、虚继承、多继承
- GLES2.0中文API-glGetUniformLocation
- 数学--逆运算知识点,附推逆函数的一例
- Could not target platform: ‘Java SE 11‘ using tool chain
热门文章
- CEEMDAN:完全噪声辅助聚合经验模态分解(matlab)——学习笔记3
- 安装node教程---个人小结
- 监听android home键的实现方式
- 失去中国市场,三星手机却连续11年居于全球第一
- 汾曲名家相国孙,翊登枢铉继承恩。继承
- [BZOJ1502][NOI2005]月下柠檬树(辛普森积分)
- 单页营销网站关键词keyword和描述description写法
- Google Chubby介绍
- 全新MacBook Pro MYD82CH/A / MYDA2CH/A / MYD92CH/A / MYDC2CH/A 配置
- 基于Labview的环境噪声测量系统