DecorView的创建、显示流程
我们知道Activity
、Dialog
的view tree的根节点是DecorView
。
DecorView
的创建、显示流程是什么样的呢?为什么Activity
的onCreate
方法里取不到view的尺寸呢?
DecorView是什么?
DecorView是个FrameLayout,包装了Title和Content,Content就是我们通过setContent()设置进去的。DecorView是Activity
、Dialog
的整个view tree的根节点。
DecorView的创建、显示流程如下:
- 第一步:在Activity.attach()里面先创建PhoneWindow和WindowManager
- 第二步:Activity.onCreate()里的setContent()会调用PhoneWindow的
installDecor()
,创建DecorView。这时只是生成一个view tree的数据结构,还没显示出来。 - 第三步:Activity.onResume()之后,把decorView add进windowMangaer,并与wms建立双向通信(双向通信涉及两个类
IWindow.Stub
和IWindowSession
,并且同一进程内它们两是多对一的关系)。 - 第四步:屏幕刷新信号来了,会调用到ViewRootImpl的
performTraversals()
来绘制。这里通过windowSession向wms申请Surface,app把绘制的内容写到Surface提供的buffer。接着SurfaceFinger渲染,最后屏幕切换下一帧,把刚才渲染的图像刷新到物理屏幕上。(因为是双缓存,所以只要在16ms以内读和写不会影响)
时序图
更多Android相关时序图,请移步andych008/flow_chart)
相关面试题
- DecorView什么时候显示?
在onResume之后。
因为onResume之后才调用wm.addView()把decorView加到windowManager。这一步decorView和wms才建立双向连接。对于app应用来讲,最终把view显示到屏幕上是通过wms来实现的。
- 为什么
Activity
的onCreate
方法里取不到view的尺寸?因为view tree还没显示出来,没有执行measure、layout、draw这些方法。原因看上一题。