理清Activity、View及Window之间关系
2016-07-26 11:33
267 查看
我的简书同步发布:理清Activity、View及Window之间关系
转载请注明出处:【huachao1001的专栏:http://blog.csdn.net/huachao1001】
将
我们知道,
感觉
如果你还是无法理解的话,你就把
关于
前面我们说过,
现在我们知道了
换句话说,站在系统的角度上看,系统是“不知道”有
相信看到这,你就知道为什么需要
前面我们知道,
其实,本质上讲,我们要显示一个窗口出来,的确可以不需要
个人理解:
转载请注明出处:【huachao1001的专栏:http://blog.csdn.net/huachao1001】
View、
Window以及
Activity主要是用于显示并与用户交互的。这让我们在初学的时候很容易弄混,而且无法理解他们区别以及联系。本文是笔者查阅相关资料后,结合自己的理解写出来。希望能帮你梳理清楚他们各自的工作职责,以及是因为什么需求导致了它们的出现。
1 View
从我之前写的【从Android代码中来记忆23种设计模式 】这篇文章可知,View(包括
ViewGroup)使用的是组合模式,即:
将
View组成成树形结构,以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。
我们知道,
View主要是用于绘制我们想要的结果,是一个最基本的
UI组件。
2 Window
2.1 Window的基本理解
简单地说,Window表示一个窗口,一般来说,
Window大小取值为屏幕大小。但是这不是绝对的,如对话框、
Toast等就不是整个屏幕大小。你可以指定Window的大小。
Window包含一个
View tree和窗口的
layout参数。
感觉
Window的理解比较抽象,我个人的理解是,
Window相当于一个容器,里面“盛放”着很多
View,这些
View是以树状结构组织起来的。
如果你还是无法理解的话,你就把
Window当成是显示器,显示器有大有小(对应
Window有大有小),
View是显示器里面具体显示的内容。
2.2 Window对象有存在的必要吗?
我个人长期有个困惑:Window能做的事情,
View对象基本都能做:像什么触摸事件啊、显示的坐标及大小啊、管理各个子
View啊等等。
View已经这么强大了,为什么还多此一举,加个
Window对象。可能有人会说因为
WindowManager管理的就是
Window对象呀,那我想问,既然这样,
Android系统直接让
WindowManager去管理
View不就好了?让
View接替
Window的工作,把
Window所做的事情都封装到
View里面不好嘛?(至少免去了我们去理解抽象的
Window,,,,O__O “…)。或许又有人说,View负责绘制显示内容,Window负责管理View,各自的工作职责不同。可是我想说,Window所做的大部分工作,View里面都有同样(或类似)的处理。这依然无法说服我!
关于
Window存在的必要,我查了国内外各种资料,最后有了我个人的理解(如果有错也欢迎评论纠正~)。在后面小节里面,我会结合我个人的理解来解释。在解释之前,我们需要了解
Window绘制过程。
2.3 Window绘制过程
在理解Window绘制过程之前,首先,我们需要知道
Surface,在
Window中持有一个
Surface,那么什么是
Surface呢?
Surface其实就是一个持有像素点矩阵的对象,这个像素点矩阵是组成显示在屏幕的图像的一部分。我们看到显示的每个
Window(包括对话框、全屏的
Activity、状态栏等)都有他自己绘制的
Surface。而最终的显示可能存在
Window之间遮挡的问题,此时就是通过
Surface Flinger对象渲染最终的显示,使他们以正确的
Z-order显示出来。一般
Surface拥有一个或多个缓存(一般2个),通过双缓存来刷新,这样就可以一边绘制一边加新缓存。
WindowManager为每个
Window创建
Surface对象,然后应用就可以通过这个
Surface来绘制任何它想要绘制的东西。而对于
WindowManager来说,这只不过是一块矩形区域而已。
前面我们说过,
View是
Window里面用于交互的
UI元素。
Window只
attach一个
View Tree,当
Window需要重绘(如,当
View调用
invalidate)时,最终转为
Window的
Surface,
Surface被锁住(
locked)并返回
Canvas对象,此时
View拿到
Canvas对象来绘制自己。当所有
View绘制完成后,
Surface解锁(
unlock),并且
post到绘制缓存用于绘制,通过
Surface Flinger来组织各个
Window,显示最终的整个屏幕。
2.4 关于Window对象存在的必要
以下是我个人理解!现在我们知道了
Window绘制过程,其实,站在系统的角度来考虑,一个
Window对象代表一块显示区域,系统不关心
Window里面具体的绘制内容,也不管你
Window怎么去绘制,反正只给你提供可以在这块区域上绘制图形的
Surface对象,你
Window对象怎么画是你的事情!
换句话说,站在系统的角度上看,系统是“不知道”有
View对象这个说法的!作为系统,我有自己的骄傲,不去管你
Window如何搬砖、如何砌墙,只给你地皮。而这时,
Window为了绘制出用户想要的组件(按钮、文字、输入框等等),系统又不给我!没事,那我自己定义,于是就定义了
View机制,给每个
View提供
Canvas,让不同的
View自己绘制具有自己特色的组件。同时,为了更好的管理
View,通过定义
ViewGroup,等等。
相信看到这,你就知道为什么需要
Window了,当然了,本文并不是去纠缠要不要
Window对象这个问题。而是通过这个问题,让我们理清
View与
Window的区别。这才是重点!到这里,如果理由说服不了你,那你就不要去纠缠了。至少,你已经理清了
View与
Window之间的关系了,这就够了!
3 Activity
3.1 Activity基本理解
对于开发人员来说,一个Activity就“相当于”一个界面(通过
setContentView指定具体的
View)。我们可以直接在Activity里处理事件,如
onKeyEvent,
onTouchEvent等。 并可以通过
Activity维护应用程序的生命周期。
3.2 Activity有存在的必要吗?
同样,我们还是以是否存在这个问题为切入点,去理清Activity与
Window关系。
前面我们知道,
Window已经是系统管理的窗口界面。那么为什么还需要
Activity呢?我们把
Activity所做的事情,全部封装到
Window不就好了?
其实,本质上讲,我们要显示一个窗口出来,的确可以不需要
Activity。悬浮窗口中不就是没有使用
Activity来显示一个悬浮窗吗?既然如此,
Window(以及
View)能处理点击事件以及封装各种逻辑,那为啥还需要Activity呢?
个人理解:
Android中的应用中,里面对各个窗口的管理相当复杂(任务栈、状态等等),
Android系统当然可以不用
Activity,让用户自己直接操作
Window来开发自己的应用。但是如果让用户自己去管理这些
Window,先不说工作量,光让用户自己去实现任务栈这点,有几个人能写的出来。为了让大家能简单、快速的开发应用,
Android通过定义Activity,让
Activity帮我们管理好,我们只需简单的去重写几个回调函数,无需直接与
Window对象接触。各种事件也只需重写
Activity里面的回调即可。无需关注其他细节,默认都帮我们写好了,针对需要定制的部分我们重写(设计模式为:模板方法模式)。
最后,如果有理解上的错误,也欢迎大家纠正。我会针对大家的意见,不断更新修改。
相关文章推荐
- <iframe>和<frame>区别
- 属性动画
- AC自动机总结
- Head_First设计模式(三)----工厂模式简单工厂
- kernel cmdline
- RxJava实战演示2,获取网络图片
- 工信部大数据工程师认证考试顺利举行
- 杭电2141Can you find it?
- 侯世达定律
- Search a 2D Matrix II
- Android实战打飞机游戏之菜单页面设计(1)
- 图片缩放及div属性
- Stay Hungry. Stay Foolish.
- ImageView缩放类型整理
- css3实现百分比宽度减固定宽度展现
- ajax之优点
- Http请求util类
- W3c盒子模型和IE盒子模型&box-sizing属性
- 数据
- android:ToolBar详解