Android 基础技术——addView 流程

发布时间:2024年01月21日
笔者希望做一个系列,整理?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添加的

?

?

文章来源:https://blog.csdn.net/xiaobaaidaba123/article/details/135728991
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。