Android 基础技术——addView 流程

笔者希望做一个系列,整理 Android 基础技术,本章是关于 addView
在了解 addView 流程之前,先回答下以下几个问题:

        PhoneWindow是什么时候创建的? 

        DectorView 是什么?

        DectorView 是什么时候创建的?

        ViewRootImpl是什么?

        ViewRootImpl 是何时创建的?

        DectorView 什么时候被添加到Window?

回答上面问题之前,先介绍下Activity的创建和 OnResume 生命周期,了解这两条线,上面的问题迎刃而解!

1.  启动Activity

  • ActivityThread.handleLaunchActivity->
    • ActivityThread.performLaunchActivity->
      • Intrumentation.newActivity -〉
      • Activity.onAttach 调用-> 
        • 创建PhoneWindow->
          • PhoneWindow->setWindowManager
      • Intrumentation.callOnCreateActivity->
        • Activity.onCreate ->
          • Activity.setContentView->
            • PhoneWindow.setContentView  ->
              • PhoneWindow.installDecor() 创建DectorView,根据 layoutResId 创建 View 并添加到 DecorView 中(但这个时候,DectorView还没添加到Window中,需要借助ViewRootImpl。ViewRootImpl是在ActivityThread.handleResumeActivity里创建的)

 

2. Activity onResume
  • ActivityThread.handleResumeActivity->
    • onResume()->
      • WindowManagerImpl.addView() ->
        • WindowManagerGlobal.addView()->
          • 创建ViewRootImpl -> 
          • ViewRootImpl.setView() ->
            • ViewRootImpl->requestLayout()->
              • ViewRootImpl->scheduleTraversals()->
                • ViewRootImpl->doTraversal()->
                  • ViewRootImpl->doTraversal()->
                  • ViewRootImpl.performTraversals()方法,测量(measure),布局(layout),绘制(draw), 从DecorView自上而下遍历整个View树.
              • Session.addToDisplay() (绘制完成后通过 WMS 显示出来->
                •  WMS.addWindow() ->
                  • SurfaceFlinger 合成图像
              • view.assignParent() 设置DectorView的Parent为 ViewRootImpl 后续 view.requestLayout 都会触发 ViewRootImpl.requestLayout() 这里回答了DectorView是什么时候添加到Window的 

 

 

ViewRooImpl 是什么?

ViewRootImpl 是 DecorView 的 parent,但是他并不是一个真正的 View,只是继承了 ViewParent 接口,用来掌管 View 的各种事件,包括 requestLayout、invalidate、dispatchInputEvent 等等。

 

Window:每个Activity都会创建一个Window用于承载View视图的显示,Window是一个抽象类,存在了一个唯一实现类PhoneWindow

DecorView:最顶层的View,是一个FrameLayout子类,最终会被加载到Window当中,它内部只有一个垂直方向的LinearLayout分为两部分:

TitleBar:屏幕顶部的状态栏

ContentView:Activity对应的XML布局,通过setContentView设置到DecorView中。

 

Window 是什么时候创建的?

在Activity 创建时,Activity.attach 方法里创建了PhoneWindow 并且设置了WindowManager(setWindowManager)

注意以下顺序:

  1. 类加载方式new了一个Activity
  2. Activity.attach (在这里Activity 和 Window 建立了联系!)
  3. intrumentation.callOnCreateActivity->Activity.onCreate -> setContentView 解析 xml

 

因此,一开始问题的答案:

  • PhonWindow 是在创建Activity的时候,Activity.attach 时候创建的;
  • DectorView 是在创建Activity的时候,setContentView 时候创建的;
  • ViewRootImpl 是 DecorView 的 parent,但是他并不是一个真正的 View,只是继承了 ViewParent 接口,用来掌管 View 的各种事件
  • ViewRootImpl 是Activity onResume的时候, WindowManagerGlobal.addView里创建的
  • DectorView 是在 ViewRootImpl.setView添加的

 

 

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

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

相关文章

ABS10-ASEMI智能LED灯具专用ABS10

编辑:ll ABS10-ASEMI智能LED灯具专用ABS10 型号:ABS10 品牌:ASEMI 封装:ABS-4 最大重复峰值反向电压:1000V 最大正向平均整流电流(Vdss):1A 功率(Pd):50W 芯片个数:4 引脚数…

曲线生成 | 图解三次样条曲线生成原理(附ROS C++/Python/Matlab仿真)

目录 0 专栏介绍1 什么是样条?2 三次样条曲线原理2.1 曲线插值2.2 边界条件2.3 系数反解 3 算法仿真3.1 ROS C仿真3.2 Python仿真3.3 Matlab仿真 0 专栏介绍 🔥附C/Python/Matlab全套代码🔥课程设计、毕业设计、创新竞赛必备!详细…

研学活动报名系统源码开发方案

一、项目背景与目标 (一)项目背景: 随着教育水平的提高和人们对综合素质培养的需求增加,研学活动作为一种教育方式受到了广大家长和学生的青睐。为了更好地组织和管理研学活动,需要建立一个研学活动报名系统&#xf…

C#,入门教程(22)——函数的基础知识

上一篇: C#,入门教程(21)——命名空间(namespace)与程序结构的基础知识https://blog.csdn.net/beijinghorn/article/details/124140653 一、函数的基本概念 一个软件的结构大体如下: 大厦application: a plaza { --…

【C++】stack与queue的模拟实现

👀樊梓慕:个人主页 🎥个人专栏:《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 🌝每一个不曾起舞的日子,都是对生命的辜负 前言 stack与queue的实现比较简…

轮胎侧偏刚度线性插值方法

一、trucksim取数据 步骤一 步骤二 二、数据导入到matlab中 利用simulink的look up table模块 1是侧偏角;2是垂直载荷;输出是侧向力。 侧向力除以侧偏角就是实时的侧偏刚度。

【LeetCode】每日一题 2024_1_21 分割数组的最大值(二分)

文章目录 LeetCode?启动!!!题目:分割数组的最大值题目描述代码与解题思路 LeetCode?启动!!! 今天是 hard,难受,还好有题解大哥的清晰讲解 题目&a…

C#实现基于Word保护性模板文件的修改

目录 制作一个保护性模板文件 给文件设置保护密码 设计模板内容 限制编辑 进一步的需求 范例运行环境 Office DCOM 配置 设计实现 进一步修改模板文件 设置和取消保护 遍历WORD内容控件 总结 制作一个保护性模板文件 在类似一些OA的自动化处理或审批类系统里&a…

【 文本到上下文 #4】NLP 与 ML

一、说明 欢迎回到我们的 NLP 博客系列!当我们进入第四部分时,焦点转移到机器学习 (ML) 和自然语言处理 (NLP) 之间的动态相互作用上。在本章中,我们将深入探讨 ML 和 NLP 的迷人协同作用&#…

【Linux】Shell 命令以及运行原理

Shell 命令以及运行原理 当用户登录 Linux 系统的时候,系统会给用户创建一个新的进程,一般叫做 bash(命令行解释器)。 Linux 严格意义上说的是一个操作系统,我们称之为 “核心( kernel )” &…

Kafka 问题排查

订单宽表数据不同步 事情的起因是专员在 ze app 上查不到订单了,而订单数据是从 mysql 的 order_search_info 查询的,order_search_info 表的数据是从 oracel 的 BZ_ORDER_INFO 表同步过来的,查不到说明同步有问题 首先重启,同步…

0004.电脑开机提示按F1

常用的电脑主板不知道什么原因,莫名其妙的启动不了了。尝试了很多方法,没有奏效。没有办法我就只能把硬盘拆了下来,装到了另一台电脑上面。但是开机以后却提示F1,如下图: 根据上面的提示,应该是驱动有问题…

Spring Security工作原理(三)

在认证之间保存请求 如处理安全异常中所示,当请求没有认证且需要认证资源时,需要保存请求以便在认证成功后重新请求受保护的资源。在Spring Security中,这是通过使用RequestCache实现来保存HttpServletRequest来实现的。 RequestCache HttpServletRequest被保存在Request…

可替代Allegro A3901的国产GC3901 5V H 桥驱动器,驱动电流能力更强,且低成本,大电流

步进电机驱动的应用方案目前市场上大多选用国外品牌的电机驱动器,其中ALLEGRO的A3901在这一块的应用很广泛。但是由于市场越来越成熟,当前对于产品开发成本要求也越来越低,国产品牌也推出了相应的镜头驱动器,因此ALLEGRO的A3901已…

Win10/11中VMware Workstation设置网络桥接模式

文章目录 一、添加VMware Bridge Protocol服务二、配置桥接参数1.启用系统Device Install Service服务2.配置VMware 需要确认物理网卡是否有添加VMware Bridge Protocol服务 添加VMware Bridge Protocol服务 提示:以下是本篇文章正文内容,下面案例可供参…

枚举类型有着一篇足以

✅作者简介:大家好,我是橘橙黄又青,一个想要与大家共同进步的男人😉😉 🍎个人主页:橘橙黄又青-CSDN博客 1.关键字enum的定义 enum是C语言中的一个关键字,enum叫枚举数据类型&#…

helm 一键部署

helm HPA rancher 安全机制 k8s的核心功能:组件功能 k8s的网络 命令行基本的增删改查 deployment statefulsets 挂载卷:emptyDir, hostPath, nfs pv pvc 动态pvc必问 configmap ingress hpa pod 的自动伸缩 helm 什么是hel…

python opencv 图片缺陷检测(讲解直方图以及相关系数对比法)

一、利用直方图的方式进行批量的图片缺陷检测(方法简单) 二、步骤(完整代码见最后) 2.1灰度转换(将原图和要检测对比的图分开灰度化) 灰度化的作用是因为后面的直方图比较需要以像素256为基准进行相关性比…

Vue2中CesiumV1.113.0加载离线地图

Vue2中CesiumV1.113.0加载离线地图,本文以天地图为例。 1.使用nodejs获取天地图 新建nodejsdownmap项目文件夹,初始化项目 npm init -y src/index.js // An highlighted block var Bagpipe require(bagpipe) var fs require("fs"); var r…

2024.1.21周报

目录 摘要 ABSTRACT 一、文献阅读 一、题目 二、摘要 三、Introduction 四、模型 一、连续时间模型 二、离散时间模型 五、结论 二、实验代码 Navier–Stokes equation 总结 摘要 本周我阅读了一篇题目为Physics-informed neural networks: A deep learning fra…