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里创建的)

Android 基础技术——addView 流程_第1张图片 

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的 

Android 基础技术——addView 流程_第2张图片 

Android 基础技术——addView 流程_第3张图片 

ViewRooImpl 是什么?

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

 Android 基础技术——addView 流程_第4张图片

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

 

 

你可能感兴趣的:(Android,基础技术,android,android,基础)