理清Activity、View及Window之间关系

来源:互联网 发布:网络教育统考网站 编辑:程序博客网 时间:2024/06/01 13:20
转载博客:http://www.jianshu.com/p/42c4fa44b674

ViewWindow以及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来说,这只不过是一块矩形区域而已。

前面我们说过,ViewWindow里面用于交互的UI元素。Windowattach一个View Tree,当Window需要重绘(如,当View调用invalidate)时,最终转为WindowSurfaceSurface被锁住(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对象这个问题。而是通过这个问题,让我们理清ViewWindow的区别。这才是重点!到这里,如果理由说服不了你,那你就不要去纠缠了。至少,你已经理清了ViewWindow之间的关系了,这就够了!

3 Activity

3.1 Activity基本理解

对于开发人员来说,一个Activity就“相当于”一个界面(通过setContentView指定具体的View)。我们可以直接在Activity里处理事件,如onKeyEvent,onTouchEvent等。 并可以通过Activity维护应用程序的生命周期。

3.2 Activity有存在的必要吗?

同样,我们还是以是否存在这个问题为切入点,去理清ActivityWindow关系。

前面我们知道,Window已经是系统管理的窗口界面。那么为什么还需要Activity呢?我们把Activity所做的事情,全部封装到Window不就好了?

其实,本质上讲,我们要显示一个窗口出来,的确可以不需要Activity。悬浮窗口中不就是没有使用Activity来显示一个悬浮窗吗?既然如此,Window(以及View)能处理点击事件以及封装各种逻辑,那为啥还需要Activity呢?

个人理解:

Android中的应用中,里面对各个窗口的管理相当复杂(任务栈、状态等等),Android系统当然可以不用Activity,让用户自己直接操作Window来开发自己的应用。但是如果让用户自己去管理这些Window,先不说工作量,光让用户自己去实现任务栈这点,有几个人能写的出来。为了让大家能简单、快速的开发应用,Android通过定义Activity,让Activity帮我们管理好,我们只需简单的去重写几个回调函数,无需直接与Window对象接触。各种事件也只需重写Activity里面的回调即可。无需关注其他细节,默认都帮我们写好了,针对需要定制的部分我们重写(设计模式为:模板方法模式)。

最后,如果有理解上的错误,也欢迎大家纠正。我会针对大家的意见,不断更新修改。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 一岁宝贝拉肚子怎么办 4岁宝贝拉肚子怎么办 2岁宝贝拉肚子怎么办 宝宝肠道蠕动慢怎么办 新生儿吃母乳吃不饱怎么办 小孩胃口不好怎么办呢 新生儿吃多了怎么办 宝宝奶量上不去怎么办 新生儿吃撑了怎么办 婴儿不够奶吃怎么办 产妇奶堵了怎么办 新生儿吃奶不吃奶粉怎么办 奶瓶吸奶费力怎么办 小孩上火感冒了怎么办 宝宝上火感冒了怎么办 3岁宝宝上火怎么办 上火又受凉感冒怎么办 上火引起的感冒怎么办 奶瓶排气孔漏水怎么办 奶嘴排气孔漏水怎么办 bbox吸管杯漏水怎么办 四个月宝宝拉肚子怎么办 租的房子坐月子怎么办 榨果汁不甜怎么办 宝宝不会喝奶粉怎么办 两个月宝宝不长肉怎么办 打疫苗后发烧怎么办 孕期不爱吃水果怎么办 孕期很少吃水果怎么办 三个月小孩不吃奶粉怎么办 三个月宝宝偏瘦怎么办 破壁机打果汁有沫怎么办 宝宝7个月坐不稳怎么办 婴儿头睡偏了怎么办天 宝宝不爱趴着怎么办 宝宝喜欢竖着抱怎么办 婴儿抱习惯了怎么办 新生儿总让抱着放下就哭可怎么办 三个月宝宝认人怎么办 三个月的宝宝认生怎么办 一岁半宝宝尿黄怎么办