DecorView的创建、显示流程

我们知道ActivityDialog的view tree的根节点是DecorView

DecorView的创建、显示流程是什么样的呢?为什么ActivityonCreate方法里取不到view的尺寸呢?

DecorView是什么?

DecorView是个FrameLayout,包装了Title和Content,Content就是我们通过setContent()设置进去的。DecorView是ActivityDialog的整个view tree的根节点。

DecorView的创建、显示流程如下:

  1. 第一步:在Activity.attach()里面先创建PhoneWindow和WindowManager
  2. 第二步:Activity.onCreate()里的setContent()会调用PhoneWindow的installDecor()创建DecorView。这时只是生成一个view tree的数据结构,还没显示出来。
  3. 第三步:Activity.onResume()之后,把decorView add进windowMangaer,并与wms建立双向通信(双向通信涉及两个类IWindow.StubIWindowSession,并且同一进程内它们两是多对一的关系)。
  4. 第四步:屏幕刷新信号来了,会调用到ViewRootImpl的performTraversals()绘制。这里通过windowSession向wms申请Surface,app把绘制的内容写到Surface提供的buffer。接着SurfaceFinger渲染,最后屏幕切换下一帧,把刚才渲染的图像刷新到物理屏幕上。(因为是双缓存,所以只要在16ms以内读和写不会影响)

时序图

更多Android相关时序图,请移步andych008/flow_chart)

相关面试题

  1. DecorView什么时候显示?

    在onResume之后。

    因为onResume之后才调用wm.addView()把decorView加到windowManager。这一步decorView和wms才建立双向连接。对于app应用来讲,最终把view显示到屏幕上是通过wms来实现的。

  2. 为什么ActivityonCreate方法里取不到view的尺寸?

    因为view tree还没显示出来,没有执行measure、layout、draw这些方法。原因看上一题。