PhoneWindow-->DecorView-->R.id.action_bar_overlay_layout-->R.id.content(正文)、R.id.action_bar_container(标题栏)
首先初始化mDecor,即DecorView为FrameLayout的子类。就是我们整个窗口的根视图了。
然后,根据theme中的属性值,选择合适的布局,通过infalter.inflater放入到我们的mDecor中。
在这些布局中,一般会包含ActionBar,Title,和一个id为content的FrameLayout。
最后,我们在Activity中设置的布局,会通过infalter.inflater压入到我们的id为android.R.id.content的FrameLayout中去(hierarchy看到两层FrameLayout的原因)
图8-4 一个Activity中的UI组件
图8-5 马良的神笔工作原理
结合之前所讲的知识,图8-5清晰地传达了如下几条信息:
· ViewRoot有一个成员变量mSurface,它是Surface类型,它和一块Raw Buffer有关联。
· ViewRoot是一个ViewParent,它的子View的绘画操作,是在画布Surface上展开的。
· Surface和SurfaceFlinger有交互,这非常类似AudioTrack和AudioFlinger之间的交互。
图8-6 ViewRoot和WMS的关系
首先,来看IWindowSession.aidl对自己的描述:
· System private per-application interface to the window manager:也就是说每个App进程都会和WMS建立一个IWindowSession会话。这个会话被App进程用于和WMS通信。后面会介绍它的requestLayout函数。
再看对IWindow.adil的描述:
· API back to a client window that the Window Manager uses to informit of interesting things happening:这句话的大意是IWindow是WMS用来做事件通知的。每当发生一些事情时,WMS就会把这些事告诉某个IWindow。可以把IWindow想象成一个回调函数。
图8-9 Surface的精简流程图
图8-15 ShardBufferServer的示意图