在Android中Activity有四种启动模式,1.standard;  2. singleTop;  3:singleTask; 4.singleInstance。这四种启动模式可以AndroidManifest中的activity标签中声明,例如launchMode =“singleTask”,其中默认是standard。

其中前面两种比较好理解,就不具体说了,但后面两种就相对不好理解了,因为牵涉到一个task的概念。

按Android官网文档的定义:task是一组activity的集合,它用来执行某一项特定的任务的。这看起来不是那么好理解,为什么不直接用application来表示呢?

诚然,一般情况下, 一个task中的activity都是同一个application中的。但Android系统并不把activity局限在一个app中,你的app可以启动另一个app中的activity,比如你可以调用系统的相机app来拍照,将相机的activity置于启动你app的task中,让用户觉得相机就是你应用的一部分,从而提高用户体验。从task的角度上来说,尽管这两个activity来自于两个不同的application,但是,确实存在于同一个task。

task在Android是用栈这种数据结构来描述的,每一个task都有自己的一个栈,存放着这个task下所有的activity. 

与task有关的另一个概念是taskAffinity,这个表示acitivity更倾向于存在于哪一个task, 和 标签下都有这个属性。 默认继承自标签中的taskAffinity,而默认是应用程序的包名。


假设有两个应用 APP1, APP2.     APP1下有两个Activity A1 和B1; APP2下有两个Activity A2 和B2,

假设B1的启动模式为singleTask,那么B1只能存在于一个task中。如果是A2启动B1,那么B1应该存在于Task2中还是Task1中呢? 答案是Task1。 因为A1和B1默认是相同的taskAffinity,都是继承APP1下标签中的taskAffinity。而A2的taskAffinity默认是继承的APP2下的taskAffinity。所以A2和B1不会存在于一个task中。这时,系统会检查是否已经存在B1实例,如果已经存在,直接将B1 任务栈上方的activity销毁弹出,并resume B1。如果不存在,创建一个task,并将B1 push进去。

    假设B1的启动模式为singleInstance,那么不论是哪个activity启动它,它都会存在于单独的一个task中。这时,系统会检查是否已经存在B1实例,如果已经存在,直接启动并resume B1。如果不存在,创建一个task,并将B1 push进去。而且这个task将不会有其他的activity存在。


更多相关文章

  1. Android(安卓)Studio 快速启动 Android(安卓)NDK 项目开发
  2. android tab 实现
  3. Android(安卓)启动程序时动画效果(渐变)
  4. Activity 的四种启动模式(launchMode)
  5. Service启动之启动方式和绑定方式
  6. Android从APP启动第三方地图导航
  7. Android学习笔记(2)————Android四大组件之二(Service )
  8. Android(安卓)创建文件的工具类
  9. Android开发之环形进度条(安卓默认…

随机推荐

  1. [置顶] Android(安卓)Studio Eclipse运行
  2. Android监听返回键
  3. android ICS4.0.3去掉相机全景模式
  4. 资源分享
  5. android 的那些触摸效果
  6. Android选项卡Tab的实现
  7. Android点击左右按钮实现左右滑动页面切
  8. Android调用系统分享
  9. android 音频总结
  10. android:layout_weight 使用