Android S(31) APP 页面绘制流程
创始人
2024-03-08 02:42:21
0

接上一篇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,并返回地址回来。

 

 

相关内容

热门资讯

AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWR报告解读 WORKLOAD REPOSITORY PDB report (PDB snapshots) AW...
AWS管理控制台菜单和权限 要在AWS管理控制台中创建菜单和权限,您可以使用AWS Identity and Access Ma...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
群晖外网访问终极解决方法:IP... 写在前面的话 受够了群晖的quickconnet的小水管了,急需一个新的解决方法&#x...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
Azure构建流程(Power... 这可能是由于配置错误导致的问题。请检查构建流程任务中的“发布构建制品”步骤,确保正确配置了“Arti...