Activity的组成结构

参考Android 8.0源码

  Activity代表一个窗口,事实上,这个窗口是由Activity的成员变量mWindow来表示的。mWindow本质上是一个PhoneWindow对象,PhoneWindow继承自抽象类Window,负责窗口的管理。但是,PhoneWindow并不用来呈现界面效果,呈现界面效果由PhoneWindow管理的DecorView对象来完成,DecorView类是FrameLayout的子类,也是整个View树的根。DecorView由三部分构成:ActionBar、标题区、内容区。
  在framework/base/core/res/res/layout/目录下,有一个布局文件screen_title.xml,在PhoneWindow.java文件的generateLayout()方法中会用到。以此文件举例。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:fitsSystemWindows="true">
    <!-- Popout bar for action modes -->
    <ViewStub android:id="@+id/action_mode_bar_stub"
              android:inflatedId="@+id/action_mode_bar"
              android:layout="@layout/action_mode_bar"
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:theme="?attr/actionBarTheme" />
    <FrameLayout
        android:layout_width="match_parent" 
        android:layout_height="?android:attr/windowTitleSize"
        style="?android:attr/windowTitleBackgroundStyle">
        <TextView android:id="@android:id/title" 
            style="?android:attr/windowTitleStyle"
            android:background="@null"
            android:fadingEdge="horizontal"
            android:gravity="center_vertical"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </FrameLayout>
    <FrameLayout android:id="@android:id/content"
        android:layout_width="match_parent" 
        android:layout_height="0dip"
        android:layout_weight="1"
        android:foregroundGravity="fill_horizontal|top"
        android:foreground="?android:attr/windowContentOverlay" />
</LinearLayout>

  在此文件中,ActionBar由ViewStub标签定义,内容区包含了两个FrameLayout标签,分别代表标题栏和正文区,id为@android:id/content的FrameLayout会被inflate成为mContentParent的FrameLayout对象,在Activity的onCreate()方法中调用setContentView()方法加载的布局内容最后就是成为mContentParent的子View。

  以下这张图片可以来描述上面各组件之间的关系:

  • Activity类似于一个框架,负责容器生命周期及活动,窗口通过Window来管理;
  • Window负责窗口管理(实际上是Window的子类PhoneWindow),窗口的绘制和渲染交给DecorView完成;
  • DecorView是View树的根,开发者为Activity定义的layout布局文件将成为DecorView的子视图ContentParent的子视图;
  • xxx_layout.xml是开发者定义的布局文件,最终inflate为DecorView的子组件;

  PhoneWindow类关联了一个名为mWindowManager的WindowManager对象,WindowManager会创建一个ViewRootImpl对象来和WindowManagerService进行沟通,WindowManagerService能获取触摸事件、键盘事件或轨迹球事件,并通过ViewRootImpl将事件分发给各个Activity。另外,ViewRootImpl还负责Activity整个GUI的绘制。

-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
------------------last line for now-------------------