Android 基础技术——addView 流程

news2024/10/6 2:21:33
笔者希望做一个系列,整理 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.coloradmin.cn/o/1400587.html

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

相关文章

conda国内加速

1、配置国内源 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ 2、显示源地址 conda config --set show_channel_urls yes

外呼机器人有什么优势?

外呼机器人有什么优势?值得受到大多数电销企业的追捧! 1、电话外呼效率高: 每天可拨打的电话数量是人工的5-10倍,人工一天只能拨打200-300通电话,机器人每天能打3000通电话以上,无须休息,按照…

PWM之舵机

舵机又称直流电机,如下图 本节承接上节,具体的PWM技术已经在上一节讲的很详细了,本节就不再讲了,那么我们的重点就放在直流电机的工作原理上了。 一、工作原理 我们研究直流电机,主要式研究直流电机旋转速度的调节&a…

linux LPT和COM回路测试(基于python+Qt+C++)

软件UI: 回路治具&#xff08;COMLPT&#xff09;&#xff1a; lpt_test.cpp&#xff08;c 源代码&#xff09;&#xff1a; #include <iostream> #include <fstream> #include <sstream> #include <unistd.h> #include <fcntl.h> #include <…

什么是游戏盾?哪家效果好。

游戏盾是什么呢&#xff0c;很多做游戏开发的客户估计都是听说过的&#xff0c;但是也不是所有的游戏开发者会运用到。因为&#xff0c;游戏盾是针对游戏行业APP业务所推出的高度可定制的网络安全管理解决方案&#xff0c;除了能针对大型DDoS攻击(T级别)进行有效防御外&#xf…

Python(18)--文件输入/输出 Ⅱ

​ 大家好&#xff01;我是码银&#x1f970; 欢迎关注&#x1f970;&#xff1a; CSDN&#xff1a;码银 公众号&#xff1a;码银学编程 前言 前一篇文章&#xff08;python(17)–文件的输入/输出-CSDN博客&#xff09;介绍了如何操作文本文件和二进制文件&#xff0c;以及对应…

设计亚马逊按销售排名功能

1&#xff1a; 定义 Use Cases 和 约束 Use cases 作用域内的Use Case Service 通过目录计算过去一周内最受欢迎的产品User 通过目录去View过去周内最受欢迎的产品Service 有高可用 作用域外 整个电商网站 设计组件&#xff08;只是计算销售排名&#xff09; 约束和假设…

【Python】模块

&#x1f6a9; WRITE IN FRONT &#x1f6a9; &#x1f50e; 介绍&#xff1a;"謓泽"正在路上朝着"攻城狮"方向"前进四" &#x1f50e;&#x1f3c5; 荣誉&#xff1a;2021|2022年度博客之星物联网与嵌入式开发TOP5|TOP4、2021|2222年获评…

C++ :命名空间域

目录 冲突与命名&#xff1a; 举个例子&#xff1a; 全局与局部&#xff1a; 域作用限定符&#xff1a; 命名空间域&#xff1a; 冲突与命名&#xff1a; 在C语言中&#xff0c;我们通常会使用stdlib.h 而stdlib.h 本质上是一个函数的库&#xff0c;在程序中使用的大多数…

django邮件通知功能-

需求&#xff1a; 1&#xff1a;下单人员下订单时需要向组长和投流手发送邮件通知 2&#xff1a;为何使用邮件通知功能&#xff1f;因为没钱去开通短信通知功能 设计 1&#xff1a;给用户信息表添加2个字段 第一个字段为&#xff1a;是否开通邮件通知的布尔值 第二个字段为: 用…

Python 折线图的绘制(Seaborn篇-04)

Python 折线图的绘制(Seaborn篇-04)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹…

详解Redisson

第1章&#xff1a;Redisson简介 大家好&#xff0c;我是小黑&#xff0c;咱们今天来聊聊Redisson&#xff0c;Redisson不只是简单地对Redis进行了封装&#xff0c;它还提供了一系列高级的分布式Java数据结构&#xff0c;像是分布式锁、原子长整型这种。 首先&#xff0c;Redi…

React 初次接触

背景 还是为了完善高大上的在线文档系统&#xff0c;虽然比着葫芦画瓢的修改了一些所谓的代码&#xff0c;慢慢的才发现&#xff0c;原来这就是传说中的React&#xff0c;所以有比较又要囫囵吞枣一下React。 基本原理 参照《React技术揭秘》 网上有电子版 &#xff0c;应该是…

Makefile编译原理 条件判断语句

一.makefile中支持条件判断语句 可以根据条件的值来决定make的执行 可以比较两个不同变量或者变量和常量值 条件判断语句语法说明&#xff1a; 条件判断关键字&#xff1a; 条件判断语句注意点&#xff1a; 条件判断语句之前可以有空格&#xff0c;但不能没有Tab字符&#x…

【Java】SpringBoot实现事件监听(异步执行)

在Spring Boot中&#xff0c;事件监听是一种机制&#xff0c;通过该机制&#xff0c;你可以定义和触发自定义的事件&#xff0c;以及在应用程序中注册监听器来响应这些事件&#xff0c;提供了一种解耦的方式来处理应用程序中的事件。 文末有源码gitee地址&#xff01;拉取可进…

MySQL基础笔记(8)多表查询

一.多表关系介绍 项目开发中&#xff0c;在进行数据库表结构设计时&#xff0c;会根据业务需求及业务模块之间的关系&#xff0c;分析并设计表结构&#xff0c;由于业务之间相互关联&#xff0c;所以各个表结构之间也会存在着各种联系&#xff0c;分为如下3类&#xff1a; 一对…

【C++提高编程(二)】

一、STL初识 1.1、STL的诞生 长久以来&#xff0c;软件界一直希望建立一种可重复利用的东西 C的面向对象和泛型编程思想&#xff0c;目的就是复用性的提升 大多情况下&#xff0c;数据结构和算法都未能有一套标准,导致被迫从事大量重复工作 为了建立数据结构和算法的一套标…

神经网络算法 —— 一文搞懂Transformer !!

文章目录 前言 一、Transformer的本质 1. Transformer架构 2. Encoder-Decoder&#xff08;编码器-解码器&#xff09; 二、Transformer的原理 1. Multi-Head Attention&#xff08;多头自注意力&#xff09; 2. Scaled Dot-Product Attention&#xff08;缩放点积注意力&#…

坦克大战游戏代码

坦克大战游戏 主函数战场面板开始界面坦克父类敌方坦克我方坦克子弹爆炸效果数据存盘及恢复图片 主函数 package cn.wenxiao.release9;import java.awt.event.ActionEvent; import java.awt.event.ActionListener;import javax.swing.JFrame; import javax.swing.JMenu; impor…

2024年【金属非金属矿山(地下矿山)安全管理人员】证考试及金属非金属矿山(地下矿山)安全管理人员模拟考试题库

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年【金属非金属矿山&#xff08;地下矿山&#xff09;安全管理人员】证考试及金属非金属矿山&#xff08;地下矿山&#xff09;安全管理人员模拟考试题库&#xff0c;包含金属非金属矿山&#xff08;地下矿山&…