Activity的启动模式
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来绑定数据。

