Android 基础技术——addView 流程

本文详细解释了Android中Activity的创建、onResume生命周期以及关键组件如PhoneWindow、DetectorView和ViewRootImpl的创建时机,重点阐述了addView的完整流程和与Activity生命周期的关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

笔者希望做一个系列,整理 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添加的

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值