在android里,有4种activity的启动模式,分别为:

“standard” (默认)

“singleTop”

“singleTask”

“singleInstance”

它们主要有如下不同:

1. 如何决定所属task

“standard”和”singleTop”的activity的目标task,和收到的Intent的发送者在同一个task内,除非intent包括参数FLAG_ACTIVITY_NEW_TASK。

如果提供了FLAG_ACTIVITY_NEW_TASK参数,会启动到别的task里。

“singleTask”和”singleInstance”总是把activity作为一个task的根元素,他们不会被启动到一个其他task里。

此话描述不正确, 感谢liuluxu1989提出。

这篇博文写的比较简单, 也没有任何图示, 不便大家理解, 建立大家直接看Dev guide. 或者下面这篇博文:

http://marshal.easymorse.com/archives/2950

2. 是否允许多个实例

“standard”和”singleTop”可以被实例化多次,并且存在于不同的task中,且一个task可以包括一个activity的多个实例;

“singleTask”和”singleInstance”则限制只生成一个实例,并且是task的根元素。

singleTop要求如果创建intent的时候栈顶已经有要创建 的Activity的实例,则将intent发送给该实例,而不发送给新的实例。

3. 是否允许其它activity存在于本task内

“singleInstance”独占一个task,其它activity不能存在那个task里;如果它启动了一个新的activity,不管新的activity的launch mode 如何,新的activity都将会到别的task里运行(如同加了FLAG_ACTIVITY_NEW_TASK参数)。

而另外三种模式,则可以和其它activity共存。

4. 是否每次都生成新实例

“standard”对于没一个启动Intent都会生成一个activity的新实例;

“singleTop”的activity如果在task的栈顶的话,则不生成新的该activity的实例,直接使用栈顶的实例,否则,生成该activity的实例。

比如现在task栈元素为A-B-C-D(D在栈顶),这时候给D发一个启动intent,如果D是 “standard”的,则生成D的一个新实例,栈变为A-B-C-D-D。

如果D是singleTop的话,则不会生产D的新实例,栈状态仍为A-B-C-D

如果这时候给B发Intent的话,不管B的launchmode是”standard” 还是 “singleTop” ,都会生成B的新实例,栈状态变为A-B-C-D-B。

“singleInstance”是其所在栈的唯一activity,它会每次都被重用。

“singleTask”如果在栈顶,则接受intent,否则,该intent会被丢弃,但是该task仍会回到前台。

当已经存在的activity实例处理新的intent时候,会调用onNewIntent()方法

如果收到intent生成一个activity实例,那么用户可以通过back键回到上一个状态;如果是已经存在的一个activity来处理这个intent的话,用户不能通过按back键返回到这之前的状态。

该文来自网络,源地址已经忘了, 原作者可以与我联系,以注明版权!

总结:

standard 每次都会新建,每个Task都可以有,且每个Task都可以有多个实例(每个Task都可以有,且可以有多个)
singleTop 当前实例如果在栈顶,就不新建实例,调用其OnNewIntent。 如不在栈顶,则新建实例(每个Task都可以有,且可以有多个,在栈顶时可复用)
singleTask 新建一个Task,如果已经有其他的Task并且包含该实例,那就直接调用那个Task的实例。(只有一个Task中会有)
singleInstance 新建一个Task,且在该Task中只有它的唯一一个实例。 (只有一个Task会有,且该Task中只有它)


FLAG_ACTIVITY_NEW_TASK 类似singleTask
FLAG_ACTIVITY_SINGLE_TOP 类似singleTop
FLAG_ACTIVITY_CLEAR_TOP 无对应


配两个图,我觉得很清晰:

(1)standard



(2)singleTask


可以将TaskA TaskB理解为两个应用,比如TaskA是你当前的应用,TaskB是默认浏览器。

当到了TaskB中后,按返回键,需要先在TaskB中返回到root,然后才能返回到TaskA。



总结成以下几句

[plain] view plain copy print ?
  1. standard每次都会新建,每个Task都可以有,且每个Task都可以有多个实例(每个Task都可以有,且可以有多个)
  2. singleTop当前实例如果在栈顶,就不新建实例,调用其OnNewIntent。如不在栈顶,则新建实例(每个Task都可以有,且可以有多个,在栈顶时可复用)
  3. singleTask新建一个Task,如果已经有其他的Task并且包含该实例,那就直接调用那个Task的实例。(只有一个Task中会有)
  4. singleInstance新建一个Task,且在该Task中只有它的唯一一个实例。(只有一个Task会有,且该Task中只有它)



From:http://blog.csdn.net/feng88724/article/details/6412638

更多相关文章

  1. Android(安卓)--- Activity生命周期
  2. android用户界面之按钮(Button)教程实例汇
  3. 锁屏界面
  4. android 零星调试笔记
  5. TabHost与RadioGroup结合完成的菜单【带效果图】5个Activity
  6. 从 Android(安卓)Sample ApiDemos 中学习 android.animation API
  7. Android常用控件
  8. SlidingMenu和ActionBarSherlock结合做出出色的App布局,Facebook
  9. Android(安卓)UI开发第十七篇——Android(安卓)Fragment实例(Lis

随机推荐

  1. MySQL8.0.26安装与卸载的完整步骤记录
  2. MySQL中的redo log和undo log日志详解
  3. 为什么MySQL选择Repeatable Read作为默认
  4. 使用ORM新增数据在Mysql中的操作步骤
  5. mysql脏页是什么
  6. 为什么MySQL分页用limit会越来越慢
  7. MySQL深度分页(千万级数据量如何快速分页
  8. ORM模型框架操作mysql数据库的方法
  9. mysql 直接拷贝data 目录下文件还原数据
  10. MySQL 四种连接和多表查询详解