Android系统-应用程序中的View框架

源码分析基于Android 7

应用程序中的View框架如图所示

1. View和ViewRoot

       单单从名称看很容易让人产生误解,因为ViewRoot并不属于View树的一分子。源码上ViewRoot和View对象也没有继承关系。更准确说ViewRoot理解为View输的管理者,ViewRoot有一个mView成员变量指向View树的根。ViewRoot核心任务就是与WindowMangerService进行通信。

2. Activity和Window的关系

     Activity是UI显示,但是Activity不直接管理View树或者ViewRoot,Activity与两者直接没有直接的联系,这中间由Window的对象关联。 源码上Activty类有一个成员变量mWdinow 。Window是一个基类,目前默认生成的都是PhoneWindow 。 

3. Window和WindowMangaerImpl的关系

     Window是面向Activity的,表示UI的外框,里内容和布局是由具体的Window子类,如PhoneWindow来规划。

     Window的另一层含义是要与WindowManagerService进行通信,但它并没有直接在自身实现这一功能。原因:一个应用程序中很可能存在多个Window。如果都单独与WMS通信,那么浪费资源有导致管理混乱,所以需要统一管理,于是就有了WindowManger,它作为Window的成员变量mWindowManger存在。这个WindowManger是个接口类,真正实现是WindowManagerImpl,后者同时也是整个应用程序中所有Window的管理者。

4. ViewRoot和WindowMangerImpl的关系

在WindowManagerImpl内部中有三个全局变量 

private View[]  mViews; 

private ViewRootImp[]   mRoots ;

private WindowManger.LayoutParam[]  mParams ;

分别是View树的根节点、ViewRoot以及Window的属性。 

5. ViewRoot和WindowMangerService

   每一个ViewRootImpl内部都有一个全局变量 

  static  IWindowSession  sWindowSession 

这个变量用于ViewRoot到WMS的链接,它是ViewRoot利用WMS的opeSession()接口来创建得到的 。在此基础上,ViewRoot也会通过IWindowSession.add()方法提供一个IWindow对象-----从而让WMS也可以通过这个Binder对象来与ViewRoot进行双向通信。 

   一个应用都有一个ActivityThread主线程以及mActivitys全局变量,后者记录了运行在应用程序中的所有Activity对象。一个Activity对应唯一的WindowManger以及ViewRootImpl。 WindowMangerGlobal作为全局管理者,内部的mRoots与mViews记录了各Activity的ViewRootImpl和View树的顶层元素。ViewRootImpl的另一个重要角色就是负责与WMS进行通信。从ViewRootImpl到WMS间的通信利用的是IWindowSession,而反向则是有IWindow来完成。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/364351.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

apk反编译修改教程系列---修改apk的默认颜色 布局颜色 手机电脑同步演示【十】

往期教程: apk反编译修改教程系列-----修改apk应用名称 任意修改名称 签名【一】 apk反编译修改教程系列-----任意修改apk版本号 版本名 防止自动更新【二】 apk反编译修改教程系列-----修改apk中的图片 任意更换apk桌面图片【三】 apk反编译修改教程系列---简单…

【Tomcat与网络11】如何自己实现一个简单的HTTP服务器

在前面我们尝试解释Tomcat的理论,但是呢,很多时候那些复杂的架构和设计会让我们眼花缭乱,以至于忽略了最进本的问题——服务器到底是什么?今天我们就用尽量简单的代码实现一个简易的HTTP服务器。 HTTP启动之后要持续监听&#xf…

ele-h5项目使用vue3+vite开发:第二节、search 搜索框组件开发

如何设计一个组件 需求分析 布局 content left-iconbodyinput-controlright-iconaction 功能 使用 defineEmits 定义组件的事件 在组件的script setup 里如何定义事件 使用defineEmits&#xff08;&#xff09;定义先声明事件接口 <script setup lang"ts"> int…

某赛通电子文档安全管理系统 UploadFileToCatalog SQL注入漏洞复现

0x01 产品简介 某赛通电子文档安全管理系统(简称:CDG)是一款电子文档安全加密软件,该系统利用驱动层透明加密技术,通过对电子文档的加密保护,防止内部员工泄密和外部人员非法窃取企业核心重要数据资产,对电子文档进行全生命周期防护,系统具有透明加密、主动加密、智能…

睿尔曼超轻量仿人机械臂——外置按钮一键启停程序配置

在睿尔曼超轻量仿人机械臂—外置按钮盒使用说明一文中&#xff0c;介绍了外置按钮盒的安装及使用。它能够使机械臂的使用变得更加编辑&#xff0c;仅需按钮即可完成运动程序的启停等控制&#xff0c;而无需进入示教界面操作。 在示教界面中&#xff0c;我们可以完成运动程序的…

UserWarning: Glyph 39640 missing from current font问题

是因为不支持中文字体导致的&#xff0c;设置为一个支持中文的字体就行了。 另外&#xff0c;上面的改动会引起负号显示为方块&#xff0c;需要额外再加一条设置。 在中文系统上 import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [SimHei] # 设置为一个支持…

xlsx xlsx-style坑记录

1 安装 npm install xlsx --savenpm install xlsx-style --save Umi运行会报错 自己代码 import XLSX from "xlsx"; import XLSXStyle from "xlsx-style";const data [["demo1","demo2","demo3","demo4","…

计算机设计大赛 深度学习 python opencv 火焰检测识别 火灾检测

文章目录 0 前言1 基于YOLO的火焰检测与识别2 课题背景3 卷积神经网络3.1 卷积层3.2 池化层3.3 激活函数&#xff1a;3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 YOLOV54.1 网络架构图4.2 输入端4.3 基准网络4.4 Neck网络4.5 Head输出层 5 数据集准备5.1 数…

CSS3的新盒子,选择器等

新增的选择器&#xff1a; 属性选择器&#xff1a; 结构伪类选择选器&#xff1a; nth较为重要&#xff1a;但公式中的字母必须是n 区别&#xff1a; nth-child&#xff1a; 认为父类下的都是儿子&#xff0c;此时就需要有对应的需要&#xff0c;如下&#xff0c;此时即使排1&…

如何从零开始开发一个PS5浏览器 | How to develop a PS5 browser

环境&#xff1a;Windows PS5一台 问题&#xff1a;PS5折腾需要使用PKG浏览器访问特定网址&#xff0c;如何自定义网址呢&#xff1f; 解决办法&#xff1a;使用开发套件PS Multi Tools开发一个空应用&#xff0c;利于deeplinkUri 参数访问网页 背景&#xff1a;PS5折腾后&…

【IMAX6U移植OpenCV】

IMAX6U移植OpenCV V1.3 一 安装通用交叉编译器1.1 下载通用交叉编译器1.2 安装通用交叉编译器1.3 验证通用交叉编译器 二 搭建 OpenCV 3.4.1 的编译环境2.1 下载 OpenCV 3.4.1 源码2.2 配置 OpenCV 环境2.3 编译 OpenCV 源码 三 Qt 项目中加入OpenCV3.1 Qt 项目的 pro 文件Open…

uniapp 使用 uni-file-picker 上传头像

此处使用 select 处理选择完文件后的逻辑&#xff0c;即将文件上传到自己的服务器。 <uni-file-picker limit"1" :del-icon"false" disable-preview :imageStyles"imageStyles"file-mediatype"image" select"upload"&g…

Debug Eigen

(参考https://eigen.tuxfamily.org/index.php?titleDeveloper%27s_Corner#Debugging_under_Visual_Studio&#xff09; 假如我们直接想要检查Eigen中的VectorXf的值&#xff0c;我们会发现无法看到内部的值&#xff0c;如图 只需要下载eigen.natvis这个文件&#xff0c; &…

【Pytorch】CNN中的Attention

目录 更大层面上的Attention在attention中&#xff0c;怎么分区channel-wise还是spatial-wise举一个Spatial-Channel Attention的例子 使用广泛的Dot-product Attentionattention机制中的query,key,value的概念解释Attention的一个例子 更大层面上的Attention 在attention中&a…

GitHub的使用操作

记得看目录哦&#xff01; 1. 创建仓库2. 下载desktop3. 把创建的库克隆到本地4. 文件拷贝到本地仓库![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/7171ac6c4ca14e3b8d22717121f79c9e.png)5. 在网址后面加/compare进行比较6. 给系统添加功能 1. 创建仓库 2. 下载…

proxmox集群从7.4升级到最新的8.1

关于proxmox&#xff0c;给Zstack的公开建议 十一放假折腾服务器札记 proxmox​​​​​​​专栏上面第一篇文写的时间还是22年6月底&#xff0c;用proxmox搭建的3机集群在合肥光源束测系统后台在线工作快两年了&#xff0c;在没有UPS保护的情况下&#xff0c;经历了实验室的…

CHS_08.2.3.6_1+生产者-消费者问题

CHS_08.2.3.6_1生产者-消费者问题 问题描述问题分析思考&#xff1a;能否改变相邻P、V操作的顺序&#xff1f;知识回顾 在这个小节中 我们会学习一个经典的进程同步互斥的问题 问题描述 并且尝试用上个小节学习的p v操作 也就是信号量机制来解决这个生产者消费者问题 问题的描…

【实战系列----消息队列 数据缓存】rabbitmq 消息队列 搭建和应用

线上运行图&#xff0c;更新不算最新版&#xff0c;但可以使用修改线程等补丁功能&#xff0c;建议使用新版本。 远程服务器配置图: 这个可以更具体情况&#xff0c;因为是缓存队列理所当然 内存越大越好&#xff0c;至于核心4核以上足够使用。4核心一样跑 这里主要是需要配置服…

麒麟系统—— openKylin 安装 Nginx

麒麟系统—— openKylin 安装 Nginx 一、准备工作1. 确保麒麟系统 openKylin 已经安装完毕。 二、下载 nginx三、解压与运行解压检查与编译安装编译运行 四、配置加入到服务中加入环境变量nginx 配置文件 五、常用命令 Nginx 是一款高性能的 HTTP 和反向代理服务器&#xff0c…

Android super.img解包和打包指南(含工具下载lpunpack、lpmake、lpdump)

本文所有命令均需要在linux 上执行 一、解包 1、将Android sparse image格式的super.img转成二进制文件 $ sudo apt install android-sdk-libsparse-utils $ simg2img super.img super.img.bin 2、下载工具lpunpack 和lpmake、lpdump 以及其依赖库 下载地址:https://downl…