Android S(31) APP 页面绘制流程

news/2024/11/21 1:23:27/

接上一篇app 启动流程调用OnCreate方法,页面布局绘制进入setContentView

1、加载布局setContentView()

这里getWindow()直接返回mWindow,这个早在onCreate 调用前Activity#attach里面完成初始化。

进入attach方法,构建一个窗体对象PhoneWindow。

  

进入mWindow.setWindowManager方法,mWindowManager 并不是WMS,而是一个WindowManagerImpl 对象,WindowManagerImpl 专注于与WMS 通信,作为WPS 在APP 中 代表,跟IApplicationThread作用差不多。

 综上setContentView的实际入口在PhoneWindow#setContentView,installDecor方法是根据主题绘制页面根部布局mDecor,也就是顶层View。mContentParent是传入的activity_main呈现的用户布局。

 用户布局绘制 在mLayoutInflater.inflate(layoutResID, mContentParent),进入LayoutInflater#inflate方法,createViewFromTag 创建activity_main的顶层布局,

rInflateChildren是递归调用,绘制顶层view下面的子view,这也是为啥XML布局嵌套层数越多,可能会导致栈溢出,因为递归是不会释放栈的。

2、添加view到窗体 wm.addView()

到此 setContentView分析结束,布局view 还没有添加到窗体,上面图一知道onCreate 结束后会调用到ActivityThread的handleResumeActivity,wm.addView(decor, l)这里把根布局添加到WM。

 

 上面说到wm 就是WindowManagerImpl对象实例,这里遇到个坑AS 里面的源码WindowManagerImpl是没有WindowManagerGlobal的,addView 是空的,就是下面这样,

 

 

 查看在线源码实际上,WindowManagerImpl#addView 方法调用WindowManagerGlobal#addView,如下

 

 进入WindowManagerGlobal#addView,看到设置view的地方就在root.setView,也就是ViewRootImpl#setView,setContentView加载的xml 构建实例会统一交给ViewRootImpl管理。另外这里view.assignParent(this), ViewRootImpl本身持有view,这句代码让view反向 持有ViewRootImpl,后续会用到。

3、页面绘制performTraversals()

 进入ViewRootImpl#setView 这里面重点看requestLayout(),scheduleTraversals()就好。

 真正绘制的方法是performTraversals(),上面Choreographer  的发起postcallback绘制请求管理绘制的节奏,内容比较复杂,现在就不展开说了。

 

 performTraversals()-> relayoutWindow()-> mWindowSession.relayout(),sWindowSession为传入参数WindowManagerGlobal.getWindowSession(),是一个binder 代理类,通过WindowManagerService#openSession中 new Session 得到,所以实现在Session #relayout(),里面又调用WindowManagerService#relayoutWindow(),这个方法的作用是在WMS 保存窗体的相关信息,且对于窗体的可见性如果有变更则需要重新计算。

WindowManagerService#relayoutWindow() ->createSurfaceControl() 创建 C++ 层的Surface。

综上,relayoutWindow 处理了两件事,1是保存信息到WMS或者根据可见性重新计算坐标等数据, 2去底层申请一个Surface,并返回地址回来。

 

 


http://www.ppmy.cn/news/721.html

相关文章

365天深度学习训练营-第P2周:彩色图片识别

目录 一、前言 二、我的环境 三、代码实现 1、数据下载以及可视化 2、CNN模型 3、训练结果可视化 4、随机图像预测 四、模型优化 1、CNN模型 2、VGG-16模型 3、Alexnet模型 4、Resnet模型 一、前言 >- **🍨 本文为[🔗365天深度学习训练营]…

12.01 M4-UART-IT实验

1.使用CORTEX-M4核,实验中断实验和串口实验结合--->上传到CSDN 按键触发时,LED灯状态取反,并且在串口工具打印一句话 KEY1按键按下,LED1状态取反,串口工具打印key1 down!!!! 主要代码gpio.c void HAL_GPI…

SpringBoot实用开发之热部署

目录 热部署 手动启动热部署 自动启动热部署 热部署范围布置 关闭热部署 热部署 能学到spring boot实用开发篇的相信都已经对IDEA和maven了如指掌了,我就基于这些前置知识来说一下热部署,其实也很简单。 手动启动热部署 首先可以在你的pom.xml文…

第二证券|汽车板块现涨停潮!多只地产债再涨到临停

在昨日大幅上涨后,今日上午A股商场持续上行,不过涨势放缓,到上午收盘,上证指数上涨0.21%。 昨日带动大市上行的地产板块今日上午涨势减缓,包含福星股份、世茂股份在内的多只地产股涨停。不过也有极少数地产股逆势跌落&…

Rust机器学习之Plotters

Rust机器学习之Plotters 本文将带领大家学习Plotters的基础用法。重点学习Plotters的图表元素和常用图表的使用。 本文是“Rust替代Python进行机器学习”系列文章的第四篇,其他教程请参考下面表格目录: Python库Rust替代方案教程numpyndarrayRust机器…

信创平台:查询CPU,内存等命令

信创平台:龙芯,海光、鲲鹏服务器查询CPU,内存等命令 #1、查看操作系统(统信操作系统) 海光查询操作系统: cat /etc/os-release查看操作系统 cat /etc/os-version查看操作系统版本 龙芯,鲲鹏查询操作系统:cat /etc…

蓝桥杯嵌入式AD采样解析

文章目录前言一、什么是AD采样二、原理图查看及cubeMX配置三、代码解析总结前言 本文将带大家学习AD采样。 一、什么是AD采样 原理部分这里就不多介绍了,给大家推荐一篇文章大家自己去了解一下即可。 AD采样 二、原理图查看及cubeMX配置 在板子上面有两个可调电…

leetcode-每日一题-1779-找到最近的有相同 X 或 Y 坐标的点(简单,数学思想)

今天这道每日一题很简单,没啥可说的,细心点即可 1779. 找到最近的有相同 X 或 Y 坐标的点 难度简单73收藏分享切换为英文接收动态反馈 给你两个整数 x 和 y ,表示你在一个笛卡尔坐标系下的 (x, y) 处。同时,在同一个坐标系下给你一…