Android中的“Application”,“Task”,“Activities”的关系

什么是Android  Application?

简单来说,一个apk文件就是一个Application。

任何一个Android Application基本上是由一些Activities组成,当用户与应用程序交互时其所包含的部分Activities具有紧密的逻辑关系,或者各自独立处理不同的响应。

这些Activities捆绑在一起成为了一个处理特定需求的Application, 并且以“.apk”作为后缀名存在于文件系统中。

Android平台默认下的应用程序 例如:Email、Calendar、Browser、Maps、Text Message、Contacts、Camera和Dialer等都是一个个独立的Apps。

安装 Application的过程也可以简单理解为将其所包裹的Activities导入到当前的系统中,如果系统中已经存在了相同的Activities, 那么将会自动将其关联,而不会重复安装相同的Activities,避免资源的浪费。

Application卸载的过程也会检查当前所关联的 Activities是否有被其它Application标签所关联,如果仅仅是提供当前的Application使用,那么将会彻底被移除,相反则不做 任何操作。

就像我们已经知道的,Application基本上是由四个模块组成:Activity、Service、Content Provider 和 Broadcast Receiver,其中Activity是实现应用的主体。

什么是 Activity Stack?

操作应用程序时,有时需要调用多个Activities来完成需求,例如:发送邮件程序,首先是进入邮件主界面,然后启动一个新的Activity用于填写新邮件内容,同时可以调出联系人列表用于插入收件人信息等等。在这个操作过程中 Android平台有一个专门用于管理Activities堆栈的机制,其可以方便的线性记录Activities实例,当完成某个操作时,可以通过导航功能返回之前的Activity(通过按操作台的“Back”按钮)。

每次启动新的Activity都将被添加到Activity Stack。用户可以方便的返回上一个Activity直到Home Screen,到达Home Screen后,将无法再继续查看堆栈记录(俗话说:到头了)。如果当前Task被中止(Interrupting the task),返回到系统主界面后启动了其它操作,当希望返回到前一个Task继续执行时,只需要再次通过主界面的Application launcher或者快捷方式启动这个Task的Root Activity便可返回其中止时的状态继续执行。

相对于Views、Windows、Menus和Dialogs而言,Activity是唯一可被记录在History stack中的数据,所以当你所设计的应用程序需要用户由A界面进入到次一级界面B,当完成操作后需要再次返回A,那么必须考虑将A看作为 Activity,否则将无法从历史堆栈中返回。

什么是Task

当我们需要一个Activity可以启动另一个Activity,可能另外一个Activity是定义在不同应用程序中的Activity。

例如,假设你想在你的应用中让用户显示一些地方的街景。而这里已经有一个Activity可以做到这一点,因此,你的Activity所需要做的只是在Intent对象中添加必要的信息,并传递给startActivity()。地图浏览将会显示你的地图。当用户按下BACK键,你的Activity会再次出现在屏幕上。

对于用户来说,看起来好像是地图浏览与你的Activity一样,属于相同的应用程序,即便是它定义在其它的应用程序里,并运行在那个应用程序的进程里。

Android通过将这两个Activity保存在同一个Task里来体现这一用户体验。简单来说,一个Task就是用户体验上的一个“应用”。 
它将相关的Activity组合在一起,以stack的方式管理(就是前面提到的Activity Stack),这就是Task。

在Android平台上可以将task简单的理解为幽多个Activity共同协作完成某项应用,而不管Activity具体属于哪个Application,

通过下图可以更清晰的理解Application、task、Activity三者之间的关系:

以往基于应用(application)的程序开发中,程序具有明确的边界,一个程序就是一个应用,一个应用为了实现功能可以采用开辟新线程甚至新进程来辅助,但是应用与应用之间不能复用资源和功能。而Android引入了基于组件开发的软件架构,虽然我们开发android程序,仍然使用一个apk工程一个Application的开发形式,但是对于Aplication的开发就用到了Activity、service等四大组件,其中的每一个组件,都是可以被跨应用复用的哦,这个就是android的神奇之处。

另外值得一提的是,虽然组件可以跨应用被调用,但是一个组件所在的进程必须是在组件所在的Aplication进程中。由于android强化了组件概念,弱化了Aplication的概念,所以在android程序开发中,A应用的A组件想要使用拍照或录像的功能就可以不用去针对Camera类进行开发,直接调用系统自带的摄像头应用(称其B应用)中的组件(称其B组件)就可以了,但是这就引发了一个新问题,A组件跑在A应用中,B组件跑在B应用中,自然都不在同一个进程中那么从B组件中返回的时候,如何实现正确返回到A组件呢?Task就是来负责实现这个功能的,它是从用户角度来理解应用而建立的一个抽象概念。因为用户所能看到的组件就是Activity,所以Task可以理解为实现一个功能而负责管理所有用到的Activity实例的栈。

另外通过对service的应用,可以得出结论,一个apk,即一个应用(Application)可以跑在多个进程中,一个进程在一个虚拟机中运行,也即一个apk可以启动多个虚拟机。

通过shareuserID可以将多个apk,跑在同一个进程中。

从而得出结论:一个虚拟机只能跑一个进程,一个进程里可以跑多个应用,一个应用也可以跑在多个进程中,这就是他们的关系。

Task 有啥用?

我们用过Android的手机就会知道有下面的场景:

假设我们首先在用IReader在看书,从选书到具体书的阅读界面,这是有好几个Activity。我们每一个点击的Activity都被放在阅读这个Task对应的Activity Stack中了,这可以放我们通过回退键返回每一个前面的Activity。

我们在阅读到一半时,想看看Sina微博,按Home键离开了IReader。

在Sina微博界面也是有多个Activity,我们一步到阅读界面。这时候我们每一个点击的Activity都被放在Sina微博这个Task对应的Activity Stack中了,这可以放我们通过回退键返回每一个前面的Activity。

我们这时候再回到IReader读书界面,原先的状态还是保留的。

显然每一个Task有自己的 Activity Stack。

Task就是这样为了方便人们使用手机而设置的,就像前面提到的场景Task可以跨Application。

下面这个图从另外一个角度描述了Application Task Activities的关系

Task通过Application launcher、Home screen的快捷方式或者 由 “Recent Tasks”(长时间按住Home键)最近使用过的Task记录中启动。

当从一个Activity中启动另外一个Activity时,Back键将作用于返回前一个Activity,与此同时 新开启的Activity将被添加到Activity Stack中。

有关更详细的可以参看这篇文章:

[译]关于Activity和Task的设计思路和方法 
http://blogold.chinaunix.net/u2/85193/showart_1966109.html

参考资料:

http://skyswim42.egloos.com/3127700

关于Activity和Task的设计思路和方法 
http://blogold.chinaunix.net/u2/85193/showart_1966109.html

Android Task 
http://www.apkbus.com/forum.php?mod=viewthread&tid=146

Android中的“Application”,“Task”,“Activities”的关系相关推荐

  1. Android Application Task Activities的关系

    什么是Android  Application? 简单来说,一个apk文件就是一个Application. 任何一个Android Application基本上是由一些Activities组成,当用户 ...

  2. Android开发中遇到的问题(四)——Android中WARNING: Application does not specify an API level requirement!的解决方法

    Android开发中遇到的问题(四)--Android中WARNING: Application does not specify an API level requirement!的解决方法 参考文 ...

  3. Android中的APK,TASK,PROCESS,USERID之间的关系

    开发Android已经有一段时间了,今天接触到底层的东西,所以对于进程,用户的id以及Android中的Task,Apk之间的关系,要做一个研究,下面就是研究结果: apk一般占一个dalvik,一个 ...

  4. android surfaceflinger 代码,Android 中的framebuffer和SurFaceFlinger的关系

    FrameBuffer 在Android中并不像在其它GUI那样直观,抽象的层次比较多,加上GUI的更新是通过OpenGLES来做的.所以让人很难搞清GUI更新的整个流程,最近要准备一个讲稿,所以花了 ...

  5. Android中Activity和task,活动亲和力,启动模式,活动状态以及生命周期,激活钝化

    Activity和task: android通过保持所有activity在同一个task中来维护用户的经历-典型是在launcher选择的 应用,栈顶活动是交互活动,back后,pop栈,即使涉及多个 ...

  6. Android中全局Application的onCreate多次调用问题

    2019独角兽企业重金招聘Python工程师标准>>> 一般来说Application的onCreate方法只会执行一次, 如果应用中采用多进程方式,oncreate方法会执行多次, ...

  7. android中matrix的单位,Android中canvas和matrix之间的关系是什么?

    我读了这个画布概述: The Canvas class holds the "draw" calls. To draw something, you need 4 basic co ...

  8. 【Android 界面效果10】Android中View,ViewGroup,Window之间的关系

    一.首先说说View和ViewGroup吧 Android系统中的所有UI类都是建立在View和ViewGroup这两个类的基础上的.所有View的子类成为"Widget",所有V ...

  9. Android中利用Application操作全局变量

    我们Application除了作为入口类初始化一些操作,还可以作为我们全局存储数据的一个容器.这里我们就讲解一下如何用Application来存储我们的数据. 首先我们要明确的一点就是,什么样的数据可 ...

最新文章

  1. 这场编程语言的发布会,不参加可太亏了!
  2. bzoj1717 [Usaco2006 Dec]Milk Patterns 产奶的模式
  3. Spring Insight – Web应用程序分析
  4. [js] 使用js实现一个图片剪裁的功能
  5. 【FZU - 2254】英语考试(最小生成树,思维,建图)
  6. Android的十六进制颜色值
  7. HTCondor下多台Linux计算集群的搭建
  8. Hive DDL DML
  9. 【VirtualBox打开出错】创建COM对象失败(XP3系统)
  10. PHP - 经典面试题大全,看这一篇就够了
  11. boost noncopyable实现与ADL
  12. 网页劫持防御方法,网页被劫持怎么办?
  13. css 里面写响应式布局,CSS3怎么做出响应式布局
  14. Cloudera Manager拓展SPARK2-2.3.0.cloudera3-1.cdh5.6.0.p0.1-el6.parcel
  15. HM编码器代码阅读(31)——帧间预测之AMVP/Merge模式(六)运动补偿
  16. 超级简单的K线合成方法
  17. K_均值聚类算法(算法设计与C代码实现)
  18. 网站中轮播图的制作方法
  19. 怎么下载QQ空间或者知乎类似网站上面的视频文件
  20. 华为云实战 之 对象存储的使用以及与腾讯云COS对比

热门文章

  1. HTTP响应报文体和长连接详解
  2. 用C#语言编写记事本
  3. 2022年最新数据库经典面试题及答案汇总(含PostgreSQL、Oracle、MySQL)
  4. 10月11日菜粕期货投资
  5. 最新版支付宝支付接入
  6. Mysql Error-1129
  7. C语言-typedef --给已经有的变量类型起名字
  8. SQLTools: 一款全功能的 VScode 轻量级数据库管理插件
  9. random.nextint()详解
  10. 手写数字识别MNIST数据集下载百度网盘链接快速下载