Android Display Graphics #从Activity看surface的创建(1)

如果图片链接失败,请扫码查看文章详情。

Android Display Graphics系列文章-汇总

系列文章请扫关注公众号!

创建Activity

Activity是Android系统的应用组件,一般情况下,开发者显示的内容是通过Activity展示的。比如 使用Android studio创建一个空activity的demo,示例代码如下

                                                       

这里的onCreate就调用到了Activity的onCreate,创建一个出来。

setContentView()用来绑定视图,将xml或java代码中的设置视图绑定到Activity上来。

Activity的创建呢,可以理解为3给个对象的创建:Window、DecorView、ViewRootImpl。

 Window的创建

当用户从launcher界面点击一个应用时,Zygote收到相应请求后fork出一个子进程,这个子进程就是APP对应的进程。这个APP的入口函数就是ActivityThread的main函数:

一系列的调用流程是:

ActivityThread#main()初始化调用attach()

-->attach() 创建ApplicationThread,并跨进程传递给AMS管理

-->AMS通过ApplicationThread通知ActivityThread创建Activity

-->performLaunchActivity() new Activity && run attach()

-->Activity#attach()  create Window对象

DecorView的创建

在Code para#1段 L18-L21行的代码调用了Activity的attach()和onCreate();

Activity activity = new Activity();

    -->activity.attach();//回调attach

    -->activity.onCreate();//回调Activity

开发者通常会在onCreate()方法中调用setContentView()设置视图文件。

流程如下:

Activity-->onCreate()-->setContentView()加载视图文件

-->setContentView()-->Window.setContentView()方法,传递视图

-->Window#setContentView()创建了顶级视图DecorView对象

-->为Activity寻找对应的主题文件,解析并添加为DecorView的子View,也就是mContentParent

-->将开发者指定的视图添加到mContentParent

Step1:DecorView 是根Root View,也个FrameLayout,所以mWindow#setContentView()函数中最先将DecorView对象创建出来。

Step2:加载Activity使用的主题文件,并且将该主题作为子View添加到DecorView,这个子View就是mContentParent。

Step3:将我们设置的视图添加为mContentParent的子View,会有一个名为R.id.content的FrameLayout,这个里面才是包含我们设置的视图.

Code para#4

开发者设置的视图添加为子View的下一步,是回调Activity中onContentChanged()方法

当我们在Activity收到onContentChanged()回调的这一刻,说明DecorView已经创建完成

ViewRootImpl的创建

1.1和1.2分别让我们拥有了一个Window对象和一个DecorView对象。

Window对象中包含了DecorView对象,DecorView包含了我们设置的视图文件。

接下来的任务就是把该Window对象传递给WMS

和前两个阶段不同的是,第三阶段是在Activity的onResume()回调中被触发的

在ActivityThread通知完onResume()的下一步调用了makeVisible()方法

makeVisible()方法中,将会调用WindowManager#addView(mDecor)将视图传递给WMS

Code para#5

·  Activity执行完onResume()以后,立刻调用makeVisible()方法准备将视图传递给WMS

·  makeVisible()方法中,调用WindowManager#addView()

·  经过层层调用,最终由进程单例WindowManagerGlobal对象执行addView()方法

·  WindowManagerGlobal#addView()中,创建了本章节主角:ViewRootImpl

·  ViewRootImpl通过binder向wms添加窗口

WindowManagerImpl是WindowManager的最终实现类,它会调用到WindowManagerGlobal#addView()方法

而WindowManagerGlobal是全局单例,每个进程有且只有一个,也就是说

所有的Activity对应的Window都由WindowManagerGlobal进行管理

因此,WindowManagerGlobal会有两个关键集合:mViews和mRoots

mViews是保管着的DecorView的集合,mRoots是保管着ViewRootImpl的集合

保管着ViewRootImpl的集合?

DecorView是每个Activity的跟视图,ViewRootImpl是什么?

//对应一个Activity,关于视图的事件触发都在此

看看ViewRootImpl类中的三个成员变量:

  • mView:DecorView让ViewRootImpl能够在事件来临时控制视图
  • mSurface:让Activity拥有绘图的能力
  • mChoreographer:让ViewRootImpl能够监听VSync信号

这个类几乎集齐了所有与视图相关的成员

/frameworks/base/core/java/android/view/WindowManagerGlobal.java

WindowManagerGlobal创建了ViewRootImpl对象后,把它保存到本地集合mRoots

接着调用ViewRootImpl#setView()方法添加视图,setView()中又调用addToDisplay()方法通过binder向WMS添加窗口

至此,Window对象的创建、DecorView的创建和ViewRootImpl的创建这三大阶段全部完成

我们来总结一下在创建Activity阶段发生的事情

·  Activity中,创建PhoneWindow类型的Window对象

·  Window中,创建DecorView对象,绑定setContentView传入的视图文件

·  调用WindowManager添加视图,准备把视图绑定到WMS

·  创建ViewRootImpl作为最终的执行者,将视图添加WM

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pdf文件太大如何压缩变小一点?这几种压缩方法很实用!

pdf文件太大如何压缩变小一点?在日常工作与学习的海洋里,我们时常遭遇PDF文件的“重量级”挑战,这些体积庞大的文档,如同数字世界的巨石,不仅吞噬着宝贵的存储资源,还拖慢了处理速度,影响设备性…

单链表算法 - 链表的回文结构

链表的回文结构_牛客题霸_牛客网对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为。题目来自【牛客题霸】https://www.nowcoder.com/practice/d281619e4b3e4a60a2cc66ea32855bfa思路1: /* struct ListNode {int val;st…

.net dataexcel 脚本公式 函数源码

示例如: ScriptExec(""sum(1, 2, 3, 4)"") 结果等于10 using Feng.Excel.Builder; using Feng.Excel.Collections; using Feng.Excel.Interfaces; using Feng.Script.CBEexpress; using Feng.Script.Method; using System; using System.Collections.Gen…

MATLAB R2023b下载安装教程汉化中文版设置

MATLAB R2023b下载安装教程汉化中文版设置 Matlab 是一款功能强大的商业数学软件 Matlab(Matrix Labortory)即矩阵实验室,它在数值计算、数据分析、算法开发、建模与仿真等众多领域都发挥着重要作用。 Matlab 具有以下显著特点和优势&…

TYPE-C接口PD取电快充协议芯片ECP5701:支持PD 2.0和PD 3.0(5V,9V,12V,15V,20V)

随着智能设备的普及,快充技术成为了越来越多用户的刚需。而TYPE-C接口作为新一代的USB接口,具有正反插、传输速度快、充电体验好等优点,已经成为了快充技术的主要接口形式。而TYPE-C接口的PD(Power Delivery)取电快充协…

MySQL学习记录 —— 이십삼 MySQL服务器文件系统(3)

文章目录 1、数据字典2、系统表各种系统表 Mysql Schema是⼀个系统库,表中存储了MySQL服务器运行时所需的信息。广义上,mysql schema包含存储MySQL程序基本数据的数据字典和用于其他操作目的的系统表。数据字典表和系统表位于数据目录下一个名为mysql.ib…

角点检测及MATLAB实现

一、角点简介 角点通常指的是两条直线构成角时的交点。‌在更广泛的应用中,‌角点这一概念也被扩展到数字图像处理领域,‌其中角点被定义为图像中物体轮廓线的连接点,‌这些点在某方面属性特别突出,‌即在某些属性上强度最大或者最…

为什么不要碰自媒体

要是失业了,搞自媒体,可行吗?毫无希望! 如今的自媒体早卷得不成样子了,很难再有机会,根本原因在于几乎没有增量用户的同时,存量用户也不再有剩余时间,全量用户的时间早已被几个自媒…

空间计算开发:Volu的集成开发工具包

在空间计算技术迅速发展的今天,VR和AR项目的开发需求日益增长。Volu,一个面向空间计算赛道的开发者工具,正致力于简化这一过程。本文将深入探讨Volu如何通过其集成环境,为开发者提供一站式的解决方案。 一、定位:空间计算的得力助手 Volu定位为一个专为空间开发设计的集…

verilog基础语法入门

文章目录 前言一、模块定义1. 模块声明2. 端口定义3. 信号类型声明4. 逻辑功能定义 二、运算符与表达式1. 算术运算符2. 逻辑运算符3. 位运算符4. 关系运算符5. 等式运算符6. 缩减运算符7. 移位运算符8. 条件运算符9. 位拼接运算符 三、语句1. 赋值语句2. 块语句3. 条件语句4. …

HarmonyOS NEXT学习——@Styles、@Extend、stateStyles

Styles装饰器 定义组件重用样式 仅支持通用属性和通用事件不支持参数可以定义全局和组件内使用,全局使用需要加function // 全局 Styles function functionName() { ... }// 在组件内 Component struct FancyUse {Styles fancy() {.height(100)} }组件内Styles的优…

C# 之工控机数据类型 高低位(大小端)、BitConverter、IsLittleEndian、字节数组转换(高低位)

八种基本数据类型:byte、short、int、long、float、double、boolean、char byte 8位、有符号的以二进制补码表示的整数 min : -128(-2^7) max: 127(2^7-1) default: 0 对应包装类:Byte short 16位、有符号的以二进制补码表示…

keil中GD32 MCU IAP中APP的存储地址如何设置?

前面和大家聊过什么是IAP,那么IAP中APP的存储地址该如何设置呢? 以keil为例,打开工程的option选项卡: 将IROM1中的地址改为你想要保存的位置,比如0x08008000开始的位置: 这样通过keil烧录,程序…

光伏电站设计的关键部分

光伏设计,作为光伏发电项目成功实施的前提与基础,其科学性与合理性直接关乎项目的发电效率、经济性及环境适应性。本文将从选址规划、系统设计、组件选型、电气布局及运维考虑等几个方面,探讨光伏设计的关键部分。 一、选址踏勘 光伏项目踏勘…

钡铼Profinet、EtherCAT、Modbus、MQTT、Ethernet/IP、OPC UA分布式IO系统BL20X系列耦合器

BL20X系列耦合器是钡铼技术开发的一款用于分布式I/O系统的设备,专为工业环境下的高速数据传输和远程设备控制而设计,支持多种工业以太网协议,包括Profinet、EtherCAT、Modbus、MQTT、Ethernet/IP和OPC UA等。如果您正在考虑部署BL20X系列耦合…

c++人脸识别项目,满足工业界对于人脸识别系统的高标准需求!(一)

目录 引言: 环境构建(本文使用cmake,开发环境ubuntu22.04,IDE为clion) 项目文件构造 CMakeLists.txt编写 简单头文件 最初成员函数实现 add函数实现思路 search函数实现思路 main函数简单实现 思路 添加环…

Spring Boot集成qwen:0.5b实现对话功能

1.什么是qwen:0.5b? 模型介绍: Qwen1.5是阿里云推出的一系列大型语言模型。 Qwen是阿里云推出的一系列基于Transformer的大型语言模型,在大量数据(包括网页文本、书籍、代码等)进行了预训练。 硬件要求:…

Spring Web MVC入门(2)(请求2)

目录 1.传递JSON数据 传递JSON对象 2.获取URL中的参数PathVariable 3.上传文件RequestPart 4.获取Cookie/Session (1)获取Cookie 简洁获取Cookie (2)获取Session Sesson读取 简洁获取Session(1) 简洁获取Session(2) 5.获取Header 简洁获取Header 1.传递JSON数据 J…

大模型计算及GPU相关概念记录

浮点运算 算力最基本的计量单位是 FLOPS,英文 Floating-point Operations Per Second,即每秒执行的浮点运算次数。浮点运算其实就是带小数的加减乘除运算。 算力的计量单位,除了 FLOPS,从小到大还有: KFLOPS&#x…

新建一个git仓库并且把已有项目推送到git远程仓库

总贴 1. 创建一个空项目,不会看新建仓库 2. 克隆这个项目到某个文件夹去,比如我想克隆到我的E盘的code下面 3. 我的这个文件夹下面是有东西的,一点都不影响 . 4. 用命令行进入这个文件夹 命令行已经显示了已经在E盘下面code文件夹, 不会…