笔者希望做一个系列,整理 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
-
创建PhoneWindow->
-
Intrumentation.callOnCreateActivity->
-
Activity.onCreate ->
-
Activity.setContentView->
-
PhoneWindow.setContentView ->
- PhoneWindow.installDecor() 创建DectorView,根据 layoutResId 创建 View 并添加到 DecorView 中(但这个时候,DectorView还没添加到Window中,需要借助ViewRootImpl。ViewRootImpl是在ActivityThread.handleResumeActivity里创建的)
-
PhoneWindow.setContentView ->
-
Activity.setContentView->
-
Activity.onCreate ->
-
ActivityThread.performLaunchActivity->
-
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树.
-
ViewRootImpl->doTraversal()->
-
Session.addToDisplay() (绘制完成后通过 WMS 显示出来->
-
WMS.addWindow() ->
- SurfaceFlinger 合成图像
-
WMS.addWindow() ->
- view.assignParent() 设置DectorView的Parent为 ViewRootImpl 后续 view.requestLayout 都会触发 ViewRootImpl.requestLayout() 这里回答了DectorView是什么时候添加到Window的
-
ViewRootImpl->scheduleTraversals()->
-
ViewRootImpl->requestLayout()->
-
WindowManagerGlobal.addView()->
-
WindowManagerImpl.addView() ->
-
onResume()->
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中。
文章来源地址https://www.toymoban.com/news/detail-822591.html
Window 是什么时候创建的?
在Activity 创建时,Activity.attach 方法里创建了PhoneWindow 并且设置了WindowManager(setWindowManager)
注意以下顺序:
- 类加载方式new了一个Activity
- Activity.attach (在这里Activity 和 Window 建立了联系!)
- intrumentation.callOnCreateActivity->Activity.onCreate -> setContentView 解析 xml
文章来源:https://www.toymoban.com/news/detail-822591.html
因此,一开始问题的答案:
- PhonWindow 是在创建Activity的时候,Activity.attach 时候创建的;
- DectorView 是在创建Activity的时候,setContentView 时候创建的;
- ViewRootImpl 是 DecorView 的 parent,但是他并不是一个真正的 View,只是继承了 ViewParent 接口,用来掌管 View 的各种事件
- ViewRootImpl 是Activity onResume的时候, WindowManagerGlobal.addView里创建的
- DectorView 是在 ViewRootImpl.setView添加的
到了这里,关于Android 基础技术——addView 流程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!