android自定义view系列:认识activity结构
标签: 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结构的更多相关文章
- Android自定义view与activity的传值
昨晚在写团队项目的时候,遇到一个问题,直到今天早上才解决...即在自定义view"转盘"结束转动后获取结果的处理中,我是想吧值传到activity中的一个textview中的,但我 ...
- Android 自定义View及其在布局文件中的使用示例(三):结合Android 4.4.2_r1源码分析onMeasure过程
转载请注明出处 http://www.cnblogs.com/crashmaker/p/3549365.html From crash_coder linguowu linguowu0622@gami ...
- Android 自定义View及其在布局文件中的使用示例(二)
转载请注明出处 http://www.cnblogs.com/crashmaker/p/3530213.html From crash_coder linguowu linguowu0622@gami ...
- Android自定义View(LimitScrollerView-仿天猫广告栏上下滚动效果)
转载请标明出处: http://blog.csdn.net/xmxkf/article/details/53303872 本文出自:[openXu的博客] 1分析 2定义组合控件布局 3继承最外层控件 ...
- 【转】Android总结篇系列:Activity Intent Flags及Task相关属性
[转]Android总结篇系列:Activity Intent Flags及Task相关属性 同上文一样,本文主要引用自网上现有博文,并加上一些自己的理解,在此感谢原作者. 原文地址: http:// ...
- 【转】Android总结篇系列:Activity启动模式(lauchMode)
[转]Android总结篇系列:Activity启动模式(lauchMode) 本来想针对Activity中的启动模式写篇文章的,后来网上发现有人已经总结的相当好了,在此直接引用过来,并加上自己的一些 ...
- 我的Android进阶之旅------>Android自定义View实现带数字的进度条(NumberProgressBar)
今天在Github上面看到一个来自于 daimajia所写的关于Android自定义View实现带数字的进度条(NumberProgressBar)的精彩案例,在这里分享给大家一起来学习学习!同时感谢 ...
- android 自定义view 前的基础知识
本篇文章是自己自学自定义view前的准备,具体参考资料来自 Android LayoutInflater原理分析,带你一步步深入了解View(一) Android视图绘制流程完全解析,带你一步步深入了 ...
- Android自定义组件系列【6】——进阶实践(3)
上一篇<Android自定义组件系列[5]--进阶实践(2)>继续对任老师的<可下拉的PinnedHeaderExpandableListView的实现>进行了分析,这一篇计划 ...
随机推荐
- rsync高级同步
rsync是一款开源的.快速的.多功能的.可实现全量及增量的本地或远程数据同步备份工具.适用于unix/linux/windows等多种操作系统平台. 两台机器拷贝数据scp,nfs(linux之间) ...
- python 中的 re.compile 函数(转)
1. 使用re.compile re模块中包含一个重要函数是compile(pattern [, flags]) ,该函数根据包含的正则表达式的字符串创建模式对象.可以实现更有效率的匹配.在直接使用字 ...
- 微信小程序学习笔记(2)--------框架之目录结构
框架提供了自己的视图层描述语言 wxml 和 WXSS,以及基于 JavaScript 的逻辑层框架,并在视图层与逻辑层间提供了数据传输和事件系统. 一.响应的数据绑定 框架的核心是一个响应的数据绑定 ...
- 整合subeclipse和Tortoise SVN
先来一个下载链接(subeclipse1.8和TortoiseSVN1.7): http://download.csdn.net/detail/cangfengluyu/8416395 对于同 ...
- 【笔记】H5自适应(待)
参考: 1.盒子模型:http://www.cnblogs.com/sunyunh/archive/2012/09/01/2666841.html 2.浮动:http://www.w3school.c ...
- 华为交换机S5700系列配置镜像端口(1:1)
配置本地镜像口(1:1) 组网需求 如图一所示,某公司行政部通过Switch与外部Internet通信,监控设备Server与Switch直连. 现在希望通过Server对行政部访问Internet的 ...
- 六款常见的Linux操作系统推荐
家常常可能因为工作或学习的需要,要使用个操作系统(比如Windows和Linux).大家对Windwos支持的文件系统可能比较熟悉,而对Linux操作系统所支持的文件系统也许比较陌生.下面小编为大家推 ...
- [Android]AndFix使用说明
AndFix使用说明 AndFix,全称是Android hot-fix.是阿里开源的一个热补丁框架,允许APP在不重新发布版本的情况下修复线上的bug.支持Android 2.3 到 6.0,并且支 ...
- 使用axis2构建webservice
axis2是可以实现webservice的一个插件,使用这个插件可以发布webservice 1:可以使用这个插件来发布webservice,可以看网址:http://clq9761.iteye.co ...
- Git如何进行分支管理?
Git如何进行分支管理? 1.创建分支 创建分支很简单:git branch <分支名> 2.切换分支 git checkout <分支名> ...