android自定义view系列:认识activity结构
来源:互联网 发布:大数据时代要求我们 编辑:程序博客网 时间:2024/06/06 01:00
标签: android 自定义view activity
开发中虽然我们调用Activity
的setContentView(R.layout.activity_main)
方法显示View视图,但是view的显示并不是由Activity来完成的,整个过程涉及到了Window
、DecorView
、ViewRoot
。四者之间关系复杂,共同协作完成视图的显示以及与用户交互。本文通过分析四者的各自职能及关系,介绍activty的组成结构。
介绍activity的结构之前,我们先了解几个概念,activity
、Window
、Decorview
、ViewRoot
、View
。他们的关系和作用在下文将会详细说明。
其中直接参与页面结构组成的为Decorview
、view
,这里的view
是指通过setContentView()
方法设置进去的view对象或者由布局文件最终解析成的view。
activity
作为安卓四大组件之一,Activity充当着应用的载体,允许开发者在其上创建一个用户界面,提供响应用户交互行为的API,并维护应用程序的生命周期。可以说,Activity并不负责视图控制,只是控制生命周期和处理事件,真正控制视图的是Window。
Window
Window顾名思义就是窗口的意思,作为窗口的Window
究竟是何方神圣,它本质上是一个继承自Window
抽象类的PhoneWindow对象。
PhoneWindow中有个内部类叫DecorView,通过创建DecorView来加载Activity中设置的布局R.layout.activity_main。Window通过WindowManager将DecorView加载其中,并将DecorView交给ViewRoot,进行视图绘制以及其他交互。
Decorview
Window中持有一个DecorView,DecorView 是 FrameLayout 的子类,也是Android视图树的根节点视图。DecorView作为顶级View,一般情况下它内部包含一个竖直方向的LinearLayout,在这个LinearLayout里面有上下三个部分,上面是一个ViewStub,中间的是标题栏,下面的是内容栏。
ViewRoot
ViewRoot是连接WindowManagerService和DecorView的纽带,WindowManagerService 能获取触摸事件、键盘事件或轨迹球事件,并通过ViewRoot将事件分发给各个 Actitivty,而且View的三大流程(测量(measure),布局(layout),绘制(draw))都必须通过ViewRoot来完成实现。
千万不要从名字上轻易的把ViewRoot归类为View树一部分,它既非View的子类,也非View的父类,但是,又实现了ViewParent接口,这让它可以作为View的名义上的父视图,可以执行父视图对子view的操作行为。ViewRoot可以被理解为“View树的管理者”——它有一个mView
成员变量,它指向的对象和上文中Window和Activity的mDecor指向的对象是同一个对象。
另外,ViewRootImpl 还负责 Activity 整个 GUI 的绘制。
从screen_title布局文件分析页面结构
sdk23版本中其中一个decorview的布局文件screen_title.xml:
<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中。
细心的读者应该不难发现,在上面的布局文件中,表示标题栏的容器非常简单,只包含一个TextView,这与我们平常看到的应用标题存在很大的出入。需要强调的是,其实在platforms\android-23\data\res\layout
中存在多个decorview的布局文件,而且在不同的版本中,其数目跟内容也存在差异。
各组件之间的关系图
可以看出:
- Activity 类似于一个框架,负责容器生命周期及活动,窗口通过 Window 来管理
- Window 负责窗口管理(实际是子类 PhoneWindow),窗口的绘制和渲染交给 DecorView完成
- DecorView 是 View 树的根,开发人员为 Activity 定义的 layout 将成为 DecorView 的子视图 ContentParent 的子视图(有点拗口,但确实是这样)
- layout.xml 是开发人员定义的布局文件,最终将被加载为DecorView的子组件
- android自定义view系列:认识activity结构
- 【自定义View系列】android的UI结构
- 自定义view系列01--Android 屏幕的常见认识
- 【自定义View系列】android自定义View概述
- android 自定义View(一、基础认识)
- Android-自定义View组件切换Activity界面
- Android自定义View系列(aige)
- android-----自定义View实现系列(一)
- android-----自定义View实现系列(一)
- android自定义View基础系列一
- 【Android自定义view系列】圆形百分比进度条
- Android自定义View系列笔记收录
- Android 自定义View实战系列 :时间轴
- Android 自定义View实战系列 :时间轴
- Android学习-认识Activity
- Android主activity向自定义view传递参数
- Android自定义View之仿知乎滑动删除Activity
- Android自定义View之Activity页面的组成
- 2017陕西省ACM省赛总结
- 面向切面编程的应用场景
- oj 1914: 找零钱
- github上传code指南
- Linux下Python环境的搭建
- android自定义view系列:认识activity结构
- 成长,从你发现自己写的代码很LOW开始
- 计算机通信分层详解
- 机器学习数学原理(7)——SVM支持向量机
- Spring Cloud初识
- 中介者模式
- MySQL数据库用户表主键自增长
- nginx实现本地图片生成缩略图
- jQuery写的一个分页展示的demo(结合bootstrap)