这篇主要关注Activity的窗口对象(Window)和根视图对象(DecorView)之间的关系以及二者的建立过程。
ActivityManagerService负责管理每个Activity整个生命周期的所有活动。ActivityThread类是运行Activity的线程,实现开发者直接调用的Activity的功能。
我们从ActivityThread启动应用程序的Activity开始,分析应用程序的Activity的Window, DecorView的创建过程。
以下是ActivityThread启动Activity的简要过程,详细过程在分析ActivityManagerService时给出。
上面顺序图共有9个步骤,其中与Activity的Window和DecorView相关的是步骤3,步骤7,和步骤9.
下面详细说明这三个步骤中与Window和DecorView相关的操作。
步骤3,Activity.attach()函数中创建了这个Activity需要用到的Window,WindowManager。其中Window的具体实现类是PhoneWindow, WindowManager的具体实现类是WindowManagerImpl的封装类Window::LocalWindowManager。下面的顺序图是Activity.attach()函数中创建Window和WindowManager的详细过程。
所以Activity.attach()函数结束后,Activity的Window和WindowManger类型的成员变量都创建完成了。Window的具体类型是PhoneWindow, WindowManager的具体类型是封装了类WindowManagerImp的Window::LocalWindowManager类。
步骤7,应用程序的Activity的onCreate()函数中会调用setContentView().这个函数的执行会触发PhoneWindow的DecorView的创建。这个DecorView即是Activity的根视图。setContentView()执行完后,应用程序中自定义的view tree 会关联到Activity的DecorView上,从而形成整个Activity的view tree,这棵view tree的根就是DecorView.
下面的顺序图是Activity.setContentView()的具体执行过程。
DecorView的创建发生在PhoneWindow的installDecor中。generateLayout中会根据应用程序的AndroidManifest.xml中指定的窗口类型来改变DecorView的样式。
setContentView()中调用mLayoutInflater.inflate(layoutResID, mContentParent);把应用程序的view tree的根view 关联到DecorView或DecorView的一个子view上。
这取决于PhoneWindow.mContentParent具体是什么。mContentParent的具体赋值在generateLayout()中,这个函数以后再详细分析。总之,setContentVIew()执行完成,应用程序的Activity的根视图DecorView建立了,并且Activity的自定义View tree 和Decor View 关联起来。
步骤9,ActivityThread.handleResumeActivity()这个函数将Activity的根视图DecorView放入WindowManagerImpl中进行管理,WindowManagerImpl会建立并维护DecorView与ViewRootImpl之间的一一对应关系。这样DecorView和ViewRootImpl之间的关系就建立起来了,ViewRootImpl是很重要的类,它可以看作DecorView, Surface, WindowManagerService三者之间的一个中介者,负责协调这三个类之间的合作。Activity的整个View tree的绘制,刷新都是这个类触发的。
以下是Activity.handleResumeActivity()的详细顺序图。
WindowManagerImpl有一个全局的实例维护着所有应用程序的DecorView及其对应的ViewRootImpl.WindowManagerImpl中有两个数组View[] 和ViewRootImpl[]分别用来存储应用程序的DecorView和ViewRootImpl.WindowManagerImpl中的addVIew()函数负责创建DecorView和ViewRootImpl的一一对应关系。
addView()中会调用ViewRootImpl的setView()将其对应的DecorView设置进去。
上述过程完成后,Activity的Window,DecorView之间的关系建立过程就清楚了,下面的类图是这个过程涉及的主要类的类图。
本文图片下载地址