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-------------------