文章目录
  1. 1. Activity启动模式
    1. 1.1. standard
    2. 1.2. singleTop
    3. 1.3. singleTask
    4. 1.4. singleInstance

Activity启动模式

当一个Activity启动另一个Activity的时候,新启动的Activity就会置于任务栈的顶端,并处于活动状态,而启动它的Activity仍然保留在任务栈中,处于停止状态,当用户按下返回键或者调用finish()方法时,系统会移除顶部的Activity,让后面的Activity恢复活动状态。但Activity并不是只有这种启动模式,事实上,一共有四种启动模式:

  • Standard
  • SingleTop
  • SingleTask
  • SingleInstance

standard

默认的启动模式,如果不指定Activity的启动模式,则使用这种方式启动Activity。这种启动模式每次都会创建新的实例。

singleTop

···
android:launchMode=”singleTop”
···

如果在Manifest文件中指定启动模式为singleTop,那么在启动时,系统会判断当前栈顶是不是要启动的Activity,如果是则不创建新的Activity而直接引用这个Activity;如果不是则创建新的Activity。这种启动模式通常适用于接收到消息的显示界面。

例如:有两个Activity A,B,启动模式分别为standard,singleTop,若意图打开顺序为A->B->B,则实际打开顺序为A->B。

singleTask

···
android:launchMode=”singleTask”
···

singleTask与singleTop类似,只不过singleTop是检测栈顶元素是否需要启动Activity,而singleTask是检测整个Activity栈中是否存在当前需要启动的Activity。如果存在,则将该Activity置于栈顶,并将该Activity以上的Activity都销毁。

例如:应用中三个ActivityA1,A2,A3。其中A2启动模式为singleTask,那么无论如何点击,都只会有一个A2的实例,并且这三个Activity都在一个任务栈中。如操作顺序为A1->A2->A3->A2->A3->A1->A2,则
操作:A1->A2,A1->A2->A3 ,A1->A2->A3->A2, A1->A2->A3->A2->A3->A1,
A1->A2->A3->A2->A3->A1->A2
实际:A1->A2 , A1->A2->A3 ,A1->A2 ,A1->A2->A3->A1 , A1->A2

singleInstance

···
android:launchMode=”singleInstance”
···
singleInstance这种启动模式和使用的浏览器工作原理类似。如果将启动模式设置为singleInstance,Activity会出现在一个新的任务栈当中,而且新的任务栈只存在这一个Activity。即如果应用A的任务栈当中创建了MainActivity实例,且启动模式为singleInstance,如果应用B也要激活MainActivity,则不需要创建,两个应用共享该Activity实例。这种启动方式常用于需要与程序分离的界面。

关于singleTop和singleInstance这两种启动模式:不能通过startActivityForResult()方法来启动另一个Activity,因为Google认为,不同Task之间,默认是不能传递数据的,如果一定要传递数据,只能通过Intent来绑定数据。

附一张官方的说明

文章目录
  1. 1. Activity启动模式
    1. 1.1. standard
    2. 1.2. singleTop
    3. 1.3. singleTask
    4. 1.4. singleInstance