Activity的启动流程及View的三大绘制流程
Activity的启动从startActivityForResult
1,开始,通过ActivityManagerService.startActivity
真正开启启动Activity,再经过ActivityStackSuperVisor
和ActivityStack
的一系列互相调用,最终会调用App.thread.scheduleLauncherActivity()
2。
在此方法中,会通过名为H
的Handler对象,调用handleLaunchActivity()
,在此方法中会调用performLaunchActivity()
和handleResumeActivity()
。
在performLaunchActivity()
方法中,会执行如下操作
- 获取待启动的Activity的组件信息
- 使用类加载器创建Activity对象
- 尝试创建Application对象 (如果没有创建的话)
- 回调Activity的onCreate、onStart方法
接着在handleResumeActivity()
中,会执行如下操作
- 回调Activity的onResume方法
- 通过WindowManager,将DecorView添加到Window中3
具体来看WindowManager.addView(DecorView)
,最终会执行View绘制的三大流程,从而让View显示到界面上,按照调用顺序如下
1.绘制的入口
WindowManager.addView(DecorView)
-> WindowManagerImpl.addView(decorView,layoutParams)
-> WIndowManagerGlobal.addView()
2.绘制的类及方法
ViewRootImpl.setView(decorView,layoutParams,parentView)
-> ViewRootImpl.requestLayout()
-> scheduleTraversals()
-> doTraversal()
-> performTraversals()
- 绘制三大流程
ViewRootImpl.performMeasure() --遍历--> View.measure()
ViewRootImpl.performLayout() --遍历--> View.layout()
ViewRootImpl.performDraw() --遍历--> View.draw()
View是如何被添加到屏幕窗口上的
一般我们加载
- 创建DecorView (顶层布局)
- 在DecorView中加载基础布局ViewGroup (拥有content这个ID)
- 将ContentView添加到content这个Layout中