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

  1. @+id/quick_settings_panel 快捷面板容器,布局风格
  1. @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流程梳理相关推荐

  1. SystemUI StatusBar流程梳理

    SystemUI之StatusBar状态栏 布局结构 下拉菜单.状态栏都是属于statusbar,结构树上也是属于顶层的super_status_bar.xml(StatusBarWindowView ...

  2. (四十四)Android O WiFi启动流程梳理

    前言:最近又重新拿起来WiFi模块,从WiFi 各个流程梳理开始复习一下. 参考博客:https://blog.csdn.net/csdn_of_coder/article/details/51541 ...

  3. .16-浅析webpack源码之编译后流程梳理

    这节把编译打包后的流程梳理一下,然后集中处理compile. 之前忽略了一个点,如下: new NodeEnvironmentPlugin().apply(compiler); // 引入插件加载 i ...

  4. 【EventBus】EventBus 源码解析 ( 注册订阅者总结 | EventBus 注册订阅者流程梳理 )

    文章目录 EventBus 注册订阅者流程梳理 EventBus 注册订阅者流程梳理 EventBus 注册订阅者流程梳理 : ① 在 客户端 调用 EventBus.getDefault().reg ...

  5. 【Binder 机制】AIDL 分析 ( AIDL 通信完整流程梳理 )

    文章目录 AIDL 跨进程通信完整流程梳理 1.AIDL 文件编译 2.注册服务 3.IMyAidlInterface.Stub.asInterface 方法获取远程服务 4.IMyAidlInter ...

  6. 在流程梳理的过程中,OA工作组应采用国际先进方法

    进行OA服务建模 服务建模是通过对全部业务流程的全面分析,初步确定业务服务和应用服务,包括服务封装的业务/应用逻辑和对外提供的操作候选. 服务建模的前提是需对业务流程和系统功能非常了解.服务建模的工作 ...

  7. android p wifi一直在扫描_(一百六十八)Android P wifi 扫描失败结果上报流程梳理-扫描上报梳理②...

    接(一百五十五)Android P wifi 扫描失败结果上报流程梳理-扫描上报梳理 扫描失败上报梳理发现梳理的差了很多,特补充 1.WificondScannerImpl @Override pub ...

  8. jeecg流程梳理学习

    jeecg 流程梳理 角色 admin 管理员 fgld 学校分管领导 bgs 学校办公室 xbld 系部领导 xbky 系部科员 jxky bmld 部门领导 发文申请 applyUserId ad ...

  9. MFC 学习笔记(一):MFC单文档程序运行流程梳理与总结

    MFC 学习笔记(一):MFC单文档程序运行流程梳理与总结 1.MFC单文档程序运行流程 1.首先利用全局变量对象 theApp 启动应用程序 (这是因为这个全局对象,基类CWinApp中 this ...

最新文章

  1. 4键电子手表说明书_家有破壁机的要收藏,教你4道早餐食谱,细腻香甜,比喝豆浆舒服...
  2. matlab基础与实例教程,MATLAB基础与实例教程
  3. Maven中安装本地Jar包到仓库中或将本地jar包上传
  4. 核心期刊投稿经验(遥感信息)
  5. rabbitmq监控queue中message数量
  6. 修改Windows登陆时显示上一次登陆的用户名
  7. g++是什么_路由器信号分为2.4G和5G,有什么区别?怎么选?
  8. 解压vmlinuz和解压initrd(initramfs)
  9. AD----如何将立创EDA元器件封装库导入AD库
  10. 2500个常用中文字符 + 130常用中英文字符
  11. java stream流处理
  12. C# 使用 Response 导出 Excel 单元格格式设置为文本格式
  13. 企业微信获取临时素材,此处接口为语音接口
  14. sql超键 候选键 主键
  15. 秒杀限制人群,如何设计秒杀服务的限流策略?
  16. 【githubshare】基于 C 语言编写的一款 2D 太空射击游戏,已在 Windows 10 和 Ubuntu Linux 16.04 系统上跑通测试
  17. 虚函数、纯虚函数、虚继承、多继承
  18. GLES2.0中文API-glGetUniformLocation
  19. 数学--逆运算知识点,附推逆函数的一例
  20. Could not target platform: ‘Java SE 11‘ using tool chain

热门文章

  1. CEEMDAN:完全噪声辅助聚合经验模态分解(matlab)——学习笔记3
  2. 安装node教程---个人小结
  3. 监听android home键的实现方式
  4. 失去中国市场,三星手机却连续11年居于全球第一
  5. 汾曲名家相国孙,翊登枢铉继承恩。继承
  6. [BZOJ1502][NOI2005]月下柠檬树(辛普森积分)
  7. 单页营销网站关键词keyword和描述description写法
  8. Google Chubby介绍
  9. 全新MacBook Pro MYD82CH/A / MYDA2CH/A / MYD92CH/A / MYDC2CH/A 配置
  10. 基于Labview的环境噪声测量系统