一、首先描述的是activity里持有成员变量mWidow的创建过程。
1.在startActivity 的过程,最终代码会调用到 ActivityThread 中的 performLaunchActivity 方法,通过反射创建 Activity 对象,并执行其 attach 方法。
2.Window 就是在这个attach方法中被创建的。
3.也是在这个attach方法中,mWindow设置WindowManager。
二、window在activity中的使用:
1.不得不提的是activity 的setContentView方法,Activity 将 setContentView 的操作交给了 PhoneWindow。
2.PhoneWindow的setContentView 中 先是调用installDecor() 来初始化 DecorView 和 mContentParent ,然后以mContentParent作为父布局加载 layoutId 。
3.那现在view 已创建好了,我们如何把view 显示出来呢?
答案是:在 onResume 阶段才会将 PhoneWindow 中的 DecorView 真正的绘制到屏幕上。在ActivityThread.handleResumeActivity这个方法调用了WindowManager.addView()
4.windowManager 实际的实现类为WindowManagerImpl ,看看WindowManagerImpl.addView()
5.mGlobal 是WindowManagerGlobal 类型,看看WindowManagerGlobal.addView()
6.可以看出是调用了ViewRootImpl .setView(),在该方法中调用requestLayout() 是让view 测量绘制的方法,然后使用mWindowSession.addToDisplay()将 View 添加到 WMS 中。
7.WindowSession 是 WindowManagerGlobal 中的单例对象,初始化代码如下:
8.sWindowSession 实际上是 IWindowSession 类型,是一个 Binder 类型,真正的实现类是 System 进程中的 Session。上图中就是用 AIDL 获取 System 进程中 Session 的对象。其 addToDisplay 方法如下: