当前位置: 首页 > news >正文

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添加的

 

 

相关文章:

  • vue+elenemt分页+springboot
  • 幻读是什么,用什么隔离级别可以防止幻读?
  • 解决Windows下VSCode控制台乱码问题
  • 一文了解GeoTrust SSL证书
  • Win10/11中VMware Workstation设置网络桥接模式
  • 【Linux】基本指令收尾
  • Win10下在Qt项目中配置SQlite3环境
  • Conmi的正确答案——eclipse C/C++显示“未解析的包含:<xxx.h>”/“Unresolved inclusion: <xxx.h>”
  • Jupyter Notebook五分钟基础速通
  • 自建ES集群
  • k8s的包管理工具helm
  • 【大数据处理技术实践】期末考查题目:集群搭建、合并文件与数据统计可视化
  • 【开源】基于JAVA的停车场收费系统
  • 【OSG案例详细分析与讲解】之十四:【立方体贴图】
  • 数字IC后端设计实现 | PR工具中到底应该如何控制density和congestion?(ICC2Innovus)
  • [笔记] php常见简单功能及函数
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • Fabric架构演变之路
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • input实现文字超出省略号功能
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • JAVA多线程机制解析-volatilesynchronized
  • jquery ajax学习笔记
  • PHP 7 修改了什么呢 -- 2
  • Phpstorm怎样批量删除空行?
  • 分享几个不错的工具
  • 关于Java中分层中遇到的一些问题
  • 关于字符编码你应该知道的事情
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • 转载:[译] 内容加速黑科技趣谈
  • 做一名精致的JavaScripter 01:JavaScript简介
  • 白色的风信子
  • #每日一题合集#牛客JZ23-JZ33
  • $.ajax()参数及用法
  • (二)JAVA使用POI操作excel
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (七)理解angular中的module和injector,即依赖注入
  • (十) 初识 Docker file
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • (原創) 物件導向與老子思想 (OO)
  • (转)Google的Objective-C编码规范
  • ./configure、make、make install 命令
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .NET CORE 3.1 集成JWT鉴权和授权2
  • .NET CORE Aws S3 使用
  • .NET Core中的去虚
  • .NET HttpWebRequest、WebClient、HttpClient
  • .NET文档生成工具ADB使用图文教程
  • [ web基础篇 ] Burp Suite 爆破 Basic 认证密码
  • [] 与 [[]], -gt 与 > 的比较
  • [《百万宝贝》观后]To be or not to be?
  • [C/C++]数据结构 深入挖掘环形链表问题
  • [Enterprise Library]调用Enterprise Library时出现的错误事件之关闭办法