Android --- Activity/Window/DecorView/ViewRootImpl的创建时机

自己看源码后的学习记录,仅供参考。

AndroidActivity/Window/DecorView/ViewRootImpl的创建时机1.Activity 的创建时机-> public static void main(String[] args)-> ActivityThread.performLaunchActivity()//	Activity 被创建的时候会调用 performLaunchActivity 方法-> Activity activity = null;// 在 performLaunchActivity 方法内部,通过类加载器创建 Activity 实例java.lang.ClassLoader cl = appContext.getClassLoader();activity = mInstrumentation.newActivity(cl, component.getClassName(), r.intent);
3.Window 的创建时机-> ActivityThread.performLaunchActivity()-> Activity.attach() // performLaunchActivity 方法内部调用了 attach-> mWindow = new PhoneWindow(this, window, activityConfigCallback);  // Activity 中的成员变量 mWindow-> mDecor = (DecorView) preservedWindow.getDecorView(); 
4.DecorView 的创建时机onCreate 中调用 setContentView 方法AppcompatActivity.setContentView ->AppCompatDelegateImpl.setContentView ->AppCompatDelegateImpl.ensureSubDecor ->AppCompatDelegateImpl.createSubDecor ->Window.getDecorView -> // Window 是个抽象类,如下:// public abstract class Window // PhoneWindow 是 Window 的实现类,如下:// public class PhoneWindow extends Window implements MenuBuilder.Callback// Window.getDecorView()也就是 PhoneWindow.getDecorView()PhoneWindow.getDecorView ->// 下面是 PhoneWindow 中的 getDecorView 方法public class PhoneWindow extends Window implements MenuBuilder.Callback @Overridepublic final @NonNull View getDecorView() {if (mDecor == null || mForceDecorInstall) {installDecor();}return mDecor;}// installDecor 方法中创建 DecorView 对象,并与 Window 绑定-> installDecor() -> mDecor = generateDecor(-1);-> new DecorView(context, featureId, this, getAttributes());	-> mDecor.setWindow(this);5.绘制流程:
->ActivityThread.handleResumeActivity()->ViewManager.addView(decor, l); // ViewManager是接口 ,如下:  // public interface ViewManager// public interface WindowManager extends ViewManager // WindowManager 还是接口// public interface WindowManager extends ViewManager// WindowManagerImpl 是 WindowManager 的实现,所以:->WindowManager ->WindowManagerImpl ->WindowManagerGlobal 的addView()ViewRootImpl是在WindowManagerGlobal的addView方法中被初始化的
并且也是在这里与DecorView进行绑定,成为DecorView的parent-> addView()-> root = new ViewRootImpl(view.getContext(), display);view.setLayoutParams(wparams);mViews.add(view);mRoots.add(root);mParams.add(wparams);// do this last because it fires off messages to start doing thingstry {root.setView(view, wparams, panelParentView);ViewRootImpl的setView方法中,又会调用requestLayout,在这里就会进行这个View树的第一次测绘。
具体的方式是通过scheduleTraversals方法向Choreographer发送一个预定的消息,
并在下一次屏幕刷新的时候调用doTraversal → performTraversals方法进行ViewTree的测量、布局和绘制。-> setView()-> requestLayout()-> scheduleTraversals()-> mChoreographer.postCallback(Choreographer.CALLBACK_TRAVERSAL, mTraversalRunnable, null);-> doTraversal()-> performTraversals()-> performMeasure() / performLayout()/ performDraw()ViewManagerWindowManagerWindowManagerImplWindowManagerGlobal之间的关系public interface ViewManager{public void addView(View view, ViewGroup.LayoutParams params);public void updateViewLayout(View view, ViewGroup.LayoutParams params);public void removeView(View view);}public interface WindowManager extends ViewManager{......}public final class WindowManagerImpl implements WindowManager {private final WindowManagerGlobal mGlobal = WindowManagerGlobal.getInstance();@overridepublic void addView(view,params){mGlobal.addView(...);}public void updateViewLayout(view,params){mGlobal.updateViewLayout(...);}public void remove(view){mGlobal.remove(...);}}public final class WindowManagerGlobal {public void addView(...){......}public void updateViewLayout(...) {......}public void removeView(...) {......}}

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

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

相关文章

全栈冲刺 之 一天速成MySQL

一、为什么使用数据库 数据储存在哪里? 硬盘、网盘、U盘、光盘、内存(临时存储) 数据持久化 使用文件来进行存储,数据库也是一种文件,像excel ,xml 这些都可以进行数据的存储,但大量数据操作…

高端网站设计公司 -蓝蓝设计数据可视化大屏服务

UI设计公司-蓝蓝设计(北京兰亭妙微科技有限公司)是一支由清华美院毕业的专业团队组成的设计公司。我们的设计师们在大屏科研信息软件UI设计领域拥有多年的工作经验和丰富的行业知识。我们对设计充满热爱,设计不仅是我们的专业和职业&#xff…

QML中支持切换语言时,对现有qml进行优化时可以使用正文中的正则表达式。匹配不带某字符串的行并且有中文

这个正则表达式,可以在qt中搜索查找到不带qsTr(标记的中文字符串。后续可以用在qml中写了中文又没加qsTr(标记但是又需要支持中英文切换时,搜索匹配到没加qsTr(标记地方,重新加上qsTr(标记。 注意:复制这个正则表达式使用时&…

行内元素和块级元素分别有哪些?有何区别?怎样转换?

行内元素和块级元素分别有哪些? 常见的块级元素: p、div、form、ul、li、ol、table、h1、h2、h3、h4、h5、h6、dl、dt、dd 常见的行级元素: span、a、img、button、input、select 有何区别? 块级元素: 总是在新行上…

[二分查找]LeetCode1964:找出到每个位置为止最长的有效障碍赛跑路线

本文涉及的基础知识点 二分查找算法合集 作者推荐 动态规划LeetCode2552:优化了6版的1324模式 题目 你打算构建一些障碍赛跑路线。给你一个 下标从 0 开始 的整数数组 obstacles ,数组长度为 n ,其中 obstacles[i] 表示第 i 个障碍的高度…

flutter开发实战-实现获取视频的缩略图封面video_thumbnail

flutter开发实战-实现获取视频的缩略图封面video_thumbnail 在很多时候,我们查看视频的时候,视频没有播放时候,会显示一张封面,可能封面没有配置图片,这时候就需要通过获取视频的缩略图来显示封面了。这里使用了video…

嵌入式软件工程师面试题——2025校招社招通用(十七)

说明: 面试群,群号: 228447240面试题来源于网络书籍,公司题目以及博主原创或修改(题目大部分来源于各种公司);文中很多题目,或许大家直接编译器写完,1分钟就出结果了。但…

第0篇红队笔记-APT-HTB

nmap 80 port-web尝试 searchploit-无结果 资源隐写查看-无结果 135 port rpcclient rpcinfo.py rpcdump.py rpcmap.py rpcmap.py爆破UUID 查看该UUID的表代表的服务能搜到UUID的漏洞 IOXIDResolver提取IPv6地址 IPV6-nmap smb smb探测目录 文件下载 测试其他目录 zip文件…

Quirks(怪癖)模式是什么?它和 Standards(标准)模式有什么区别?

前言: "Quirks模式"和"Standards模式"是与HTML文档渲染模式相关的两种模式。它们影响着浏览器如何解释和渲染HTML和CSS。理解它们之间的区别对于前端开发者和网页设计师来说是至关重要的。本文将深入讨论Quirks模式和Standards模式的区别,以及它…

vscode如何在没有网络的情况下安装插件

vscode如何在没有网络的情况下安装插件 start 遇到没有网络的电脑,无法直接从插件市场安装vscode的插件。写一下 vscode 插件离线安装的方法. 解决方案 目标电脑没有可以安装插件的网络,那我们只能在有网络的环境下载好我们的插件。然后拷贝软件到无…

【Qt之QColor】

QColor是Qt框架中一个表示颜色的类&#xff0c;它提供了大量的方法进行颜色的构造、转换和操作。C示例如下&#xff1a; #include <QApplication> #include <QWidget> #include <QPainter> #include <QColor>class Example : public QWidget { public…

一文解决msxml3.dll文件缺失问题,快速修复msxml3.dll

在了解问题之前&#xff0c;我们必须首先清楚msxml3.dll到底是什么。DLL&#xff08;Dynamic Link Libraries&#xff09;文件是Windows操作系统使用的一个重要组成部分&#xff0c;用于存储执行特定操作或任务的代码和数据。msxml3.dll为Windows系统提供处理XML文档的功能。如…

键盘打字盲打练习系列之指法练习——2

一.欢迎来到我的酒馆 盲打&#xff0c;指法练习&#xff01; 目录 一.欢迎来到我的酒馆二.开始练习 二.开始练习 前面一个章节简单地介绍了基准键位、字母键位和数字符号键位指法&#xff0c;在这个章节详细介绍指法。有了前面的章节的基础练习&#xff0c;相信大家对盲打也有了…

HarmonyOS

基本概念 1、ARKTS是由ArkUI框架提供&#xff0c;它是声明式UI 2、声明式UI的思想&#xff1a;- 关心描述UI的呈现结果&#xff0c;而不关心过程&#xff1b;- 状态驱动视图更新自定义组件的组成 关键字说明举例struct声明组件名struct ToDolist 代办组件EntryComponent装饰…

Ubuntu 2204 安装libimobiledevice

libimobiledevice是一个开源的软件&#xff0c;它可以直接使用系统原生协议和IOS设备进行通信&#xff0c;类似iMazing&#xff0c;iTunes&#xff0c;libimobiledevice不依赖IOS的私有库&#xff0c;并且连接IOS设备时用的都是原生协议&#xff0c;IOS无需越狱就能实现设备信息…

二分查找算法的C语言实现以及复杂度分析

二分查找是一种在有序数组中查找特定元素的算法。其基本思想是通过不断地将数组分成两半并排除其中一半来缩小搜索范围。 二分查找算法的C语言实现 #include <stdio.h> // 二分查找函数 int binarySearch(int arr[], int l, int r, int x) {while (l < r) // 当左边…

C++ std::string 类的 substr 函数

在 C 中&#xff0c;std::string 类的 substr 函数用于从字符串中提取一个子字符串。这个函数非常实用&#xff0c;常用于字符串处理任务。以下是 substr 函数的基本用法和细节&#xff1a; 函数原型 substr 函数的原型如下&#xff1a; string substr(size_t pos 0, size_…

贝斯手-MISC-bugku-解题步骤

——CTF解题专栏—— 题目信息&#xff1a; 题目&#xff1a;贝斯手 作者&#xff1a;Tokeii 提示&#xff1a;无 解题附件&#xff1a; 解题思路&信息收集&#xff1a; 详细信息看了&#xff0c;没有藏料&#xff0c;这次上来就是一个命好名的压缩包浅浅打开一下&…

组合总和(回溯)

题目描述 找出所有相加之和为 n 的 k 个数的组合&#xff0c;且满足下列条件&#xff1a; 只使用数字1到9每个数字 最多使用一次 返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次&#xff0c;组合可以以任何顺序返回。 样例输入 示例 1: 输入: k 3, n 7 …