android4.0.1 Activity的Window,DecorView 之间关系的建立过程分析

这篇主要关注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之间的关系建立过程就清楚了,下面的类图是这个过程涉及的主要类的类图。

本文图片下载地址

你可能感兴趣的:(android4.0.1 Activity的Window,DecorView 之间关系的建立过程分析)