Android应用程序窗口(Activity)的视图对象(View)的创建过程分析

               

       从前文可知道,每一个Activity组件都有一个关联的Window对象,用来描述一个应用程序窗口。每一个应用程序窗口内部又包含有一个View对象,用来描述应用程序窗口的视图。应用程序窗口视图是真正用来实现UI内容和布局的,也就是说,每一个Activity组件的UI内容和布局都是通过与其所关联的一个Window对象的内部的一个View对象来实现的。在本文中,我们就详细分析应用程序窗口视图的创建过程。

《Android系统源代码情景分析》一书正在进击的程序员网(http://0xcc0xcd.com)中连载,点击进入!

       在前面Android应用程序窗口(Activity)实现框架简要介绍和学习计划一文中提到,应用程序窗口内部所包含的视图对象的实际类型为DecorView。DecorView类继承了View类,是作为容器(ViewGroup)来使用的,它的实现如图1所示:


图1 DecorView类的实现

        这个图的具体描述可以参考Android应用程序窗口(Activity)实现框架简要介绍和学习计划一文中的图5,这里不再详述。

        从前面Android应用程序窗口(Activity)实现框架简要介绍和学习计划一文还可以知道,每一个应用程序窗口的视图对象都有一个关联的ViewRoot对象,这些关联关系是由窗口管理器来维护的,如图2所示:


图2 应用程序窗口视图与ViewRoot的关系图

        这个图的具体描述可以参考Android应用程序窗口(Activity)实现框架简要介绍和学习计划一文中的图6,这里不再详述。

        简单来说,ViewRoot相当于是MVC模型中的Controller,它有以下职责:

        1. 负责为应用程序窗口视图创建Surface。

        2. 配合WindowManagerService来管理系统的应用程序窗口。

        3. 负责管理、布局和渲染应用程序窗口视图的UI。

        那么,应用程序窗口的视图对象及其所关联的ViewRoot对象是什么时候开始创建的呢? 从前面Android应用程序窗口(Activity)的窗口对象(Window)的创建过程分析一文可以知道,Activity组件在启动的时候,系统会为它创建窗口对象(Window),同时,系统也会为这个窗口对象创建视图对象。另一方面,当Activity组件被激活的时候,系统如果发现与它的应用程序窗口视图对象所关联的ViewRoot对象还没有创建,那么就会先创建这个ViewRoot对象,以便接下来可以将它的UI渲染出来。

       从前面Android应用程序启动过程源代码分析一文可以知道,Activity组件在启动的过程中,会调用ActivityThread类的成员函数handleLaunchActivity,用来创建以及首次激活Activity组件,因此,接下来我们就从这个函数开始,具体分析应用程序窗口的视图对象及其所关联的ViewRoot对象的创建过程,如图3所示:


图3 应用程序窗口视图的创建过程

        这个过程一共可以分为13个步骤,接下来我们就详细分析每一个步骤。

        Step 1. ActivityThread.handleLaunchActivity

public final class ActivityThread {    ......    private final void handleLaunchActivity(ActivityClientRecord r, Intent customIntent) {        ......        Activity a = performLaunchActivity(r, customIntent);        if (a != null) {            ......            handleResumeActivity(r.token, false, r.isForward);            ......        }        ......    }    ......}
        这个函数定义在文件frameworks/base/core/java/android/app/ActivityThread.java文件中。

        函数首先调用ActivityThread类的成员函数performLaunchActivity来创建要启动的Activity组件。在创建Activity组件的过程中,还会为该Activity组件创建窗口对象和视图对象。Activity组件创建完成之后,就可以将它激活起来了,这是通过调用ActivityThread类的成员函数handleResumeActivity来执行的。

        接下来,我们首先分析ActivityThread类的成员函数performLaunchActivity的实现,以便可以了解应用程序窗口视图对象的创建过程,接着再回过头来继续分析ActivityThread类的成员函数handleResumeActivity的实现,以便可以了解与应用程序窗口视图对象所关联的ViewRoot对象的创建过程。

        Step 2. ActivityThread.performLaunchActivity

        这个函数定义在文件frameworks/base/core/java/android/app/ActivityThread.java文件中。

        这一步可以参考Android应用程序窗口(Activity)的运行上下文环境(Context)的创建过程分析一文的Step 1,它主要就是创建一个Activity组件实例,并且调用这个Activity组件实例的成员函数onCreate来让其执行一些自定义的初始化工作。

        Step 3. Activity.onCreate

        这个函数定义在文件frameworks/base/core/java/android/app/Activity.java中。

        这一步可以参考Android应用程序窗口(Activity)的运行上下文环境(Context)的创建过程分析一文的Step 10。我们在实现一个Activity组件的时候,也就是在实现一个Activity子类的时候,一般都会重写成员函数onCreate,以便可以执行一些自定义的初始化工作,其中就包含初始化UI的工作。例如,在前面在Ubuntu上为Android系统内置Java应用程序测试Application Frameworks层的硬件服务一文中,我们实现了一个名称为Hello的Activity组件,用来测试硬件服务,它的成员函数onCreate的样子长得大概如下所示:

public class Hello extends Activity implements OnClickListener {      ......            /** Called when the activity is first created. */      @Override      public void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          setContentView(R.layout.main);            ......      }      ......}
       其中,调用从父类Activity继承下来的成员函数setContentView就是用来创建应用程序窗口视图对象的。

       接下来,我们就继续分析Activity类的成员函数setContentView的实现。

       Step 4. Activity.setContentView

public class Activity extends ContextThemeWrapper        implements LayoutInflater.Factory,        Window.Callback, KeyEvent.Callback,        OnCreateContextMenuListener, ComponentCallbacks {    ......    private Window mWindow;    ......    public Window getWindow() {        return mWindow;    }    ......    public void setContentView(int layoutResID) {        getWindow().setContentView(layoutResID);    }    ......}
        这个函数定义在文件frameworks/base/core/java/android/app/Activity.java中。

        Activity类的成员函数setContentView首先调用另外一个成员函数getWindow来获得成员变量mWindow所描述的一个窗口对象,接着再调用这个窗口对象的成员函数setContentView来执行创建应用程序窗口视图对象的工作。

        从前面

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值