Android 四种启动模式(Launch Mode) 最直观详解

1.standard

Android 四种启动模式(Launch Mode) 最直观详解_第1张图片

通过textView.setText(this+""); 根据HashCode(activityId)可判断出每次都创建了新Activity : startActivity(ActivityX.this,ActivityX.class)。

上图中A1、A2、A3是代表ActivityA的三个实例。

2.singleTop


如果栈顶已有要创建的Activity实例,则将intent发送给该实例(hashcode=41e706d0)而不发给新实例。用singleTop模式可解决栈顶多个重复相同的Activity的问题。

生命周期:

Android 四种启动模式(Launch Mode) 最直观详解_第2张图片

注:其中填充为绿色的两个方块是代表同一个Activity实例(activityId相同)。

如果是A-->B-->A,如下:

A:singleTop

B:standard

Android 四种启动模式(Launch Mode) 最直观详解_第3张图片

从B跳到A时,A若不在栈顶则和standard模式效果一样创建一个新A实例。

若是A-->B-->A-->B-->A,这时的运行情况如下:

Android 四种启动模式(Launch Mode) 最直观详解_第4张图片

通过HashCode可以很清楚地知道是一个新实例还是一个已存在的实例。

生命周期(A-->B-->A):

Android 四种启动模式(Launch Mode) 最直观详解_第5张图片


3.singleTask

A:singleTask

B:standard

A-->B-->A-->B:

Android 四种启动模式(Launch Mode) 最直观详解_第6张图片

注:绿色方块是指同一个Activity实例。B->A时,A之前栈中的Activity被清空。关于它的生命周期,通过Intent启动一个Activity,如果系统已经存在一个实例,系统就会将请求发送到这个实例上,但这时系统不会再调用onCreate来处理请求数据,而是调用onNewIntent方法。

4.singleInstance

A:standard

B:singleInstance

Android 四种启动模式(Launch Mode) 最直观详解_第7张图片

注:一个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。



你可能感兴趣的:(Java/Android)