1.standard
通过textView.setText(this+""); 根据HashCode(activityId)可判断出每次都创建了新Activity : startActivity(ActivityX.this,ActivityX.class)。
上图中A1、A2、A3是代表ActivityA的三个实例。
2.singleTop
如果栈顶已有要创建的Activity实例,则将intent发送给该实例(hashcode=41e706d0)而不发给新实例。用singleTop模式可解决栈顶多个重复相同的Activity的问题。
生命周期:
注:其中填充为绿色的两个方块是代表同一个Activity实例(activityId相同)。
如果是A-->B-->A,如下:
A:singleTop
B:standard
从B跳到A时,A若不在栈顶则和standard模式效果一样创建一个新A实例。
若是A-->B-->A-->B-->A,这时的运行情况如下:
通过HashCode可以很清楚地知道是一个新实例还是一个已存在的实例。
生命周期(A-->B-->A):
3.singleTask
A:singleTask
B:standard
A-->B-->A-->B:
注:绿色方块是指同一个Activity实例。B->A时,A之前栈中的Activity被清空。关于它的生命周期,通过Intent启动一个Activity,如果系统已经存在一个实例,系统就会将请求发送到这个实例上,但这时系统不会再调用onCreate来处理请求数据,而是调用onNewIntent方法。
4.singleInstance
A:standard
B:singleInstance
注:一个task就是一个栈,一个栈里可放入多个Activity。taskId=this.getTaskId()。
taskId=1671的栈先回退完,之后再回退taskId=1672的栈。
如果A:singleInstance,B:standard,则A->B->A->back->B->finish。
文字理解说明:
Activity启动模式设置:
Activity的四种启动模式:
1. standard
默认启动模式,每次激活Activity时都会创建Activity,并放入任务栈中。
2. singleTop
如果在任务的栈顶正好存在该Activity的实例,就重用该实例,否者就会创建新的实例并放入栈顶(即使栈中已经存在该Activity实例,只要不在栈顶,都会创建实例)。
3. singleTask
如果在栈中已经有该Activity的实例,就重用该实例(会调用实例的onNewIntent())。重用时,会让该实例回到栈顶,因此在它上面的实例将会被移除栈。如果栈中不存在该实例,将会创建新的实例放入栈中。
4. singleInstance
在一个新栈中创建该Activity实例,并让多个应用共享改栈中的该Activity实例。一旦改模式的Activity的实例存在于某个栈中,任何应用再激活改Activity时都会重用该栈中的实例,其效果相当于多个应用程序共享一个应用,不管谁激活该Activity都会进入同一个应用中。
=============================================================================
下面是Android中文WiKi原文:
android:launchMode Activity启动的指令。有四种模式和Activity的标志(常量FLAG_ACTIVITY_*)一起使用。在 Intent对象里决定当Activity被调用来处理intent时做什么事情。它们是:
"standard" "singleTop" "singleTask" "singleInstance"
默认模式是standard。
下表显示了:模式可以分为两大类,一类是standard和singleTop。另一类是singleTask和singleInstance及其它。设置为standard或singleTop启动模式的Activity可以多次实例化。实例可以属于任何任务也可以位于Activity栈的任何地方。典型地,一个任务通过调用函数startActivity() (除非intent对象包含FLAG_ACTIVITY_NEW_TASK,这个不同于任务选择——阅读taskAffinity 属性)来启动Activity。
对比一下,和Activity可以先于任务。它们在Activity栈里是根。此外,设备同一时间可以运行一个Activity实例——只有这样一个任务。
standard和singleTop模式和其它模式仅仅有一个方面不同:总会有一个intent对应的standard Activity,为了响应这个intent会创建一个新的实例。每个实例处理一个intent。同样地,为处理intent也会创建一个新的singleTop Activity实例。然而,如果目标任务已经有一个Activity实例在栈的顶层,这个实例会收到新的intent(在onNewIntent()里调用);一个新的实例不会被创建。其它情况下——例如:如果存在一个singleTop Activity实例,但是没有在栈顶,或在栈顶但是没有在目标任务——一个新实例会被创建并且放到栈里。
singleTask和singleInstance模式和其它Activity有一个方面的不同:singleTask Activity允许任务存在其它Activity。这种Activity总是位于任务的根,但是其它Activity(standard和singleTop Activity)可以在任务里启动。singleInstance Activity,另一方面不允许其它Activity存在于任务里。它是任务里仅有的Activity。如果启动了其他Activity,那个Activity被赋值给其它任务——就像在FLAG_ACTIVITY_NEW_TASK intent。
表格设计:
用例 | 启动模式 | 多实例? | 注释 |
---|---|---|---|
大多数Activity的启动模式 | standard | 是 | 默认值。系统总是在目标任务里创建一个新的Activity实例,并且路由一个intent给Activity。 |
大多数Activity的启动模式 | singleTop | 有条件的 | 如果Activity的实例已经在任务的栈顶存在,系统通过调用函数onNewIntent() 路由intent到Activity的实例,而不是创建一个新的Activity实例。 |
指定启动(一般不建议使用) | singleTask | 否 | 系统在任务的根创建一个Activity并且把intent传递给它。然而,如果已经有一个Activity存在了,系统通过调用函数onNewIntent()传递intent,而不是创建一个新的Activity。 |
指定启动(一般不建议使用) | singleInstance | 否 | 就像singleTask,除非系统启动其它Activity,否则,Activity总是唯一的,仅仅属于它的任务。 |
就像上表里展示的,standard 是默认的模式,SingleTop 也是适合大多数Activity的模式。也是很常见、有用的启动模式。其它模式——singleTask 和singleInstance ——不适合大多数程序,它们在一个相互作用的模式对于用户来说不常见,也会和其它程序很不同。
不论你选择什么启动模式,记得测试它们的可用性并且通过Back按钮从其它Activity或任务返回到这个Activity。