1.standard
默认模式,可以不用写配置。在这个模式下,每次激活 Activity 时都会创建 Activity 实例,并放入回退栈中(栈顶).该 activity 可以被实例化多次,各个实例可以属于不同的 task,一个 task 中也可以存在多个实例。
例如:若我有一个Activity名为A1, 上面有一个按钮可跳转到A1。那么如果我点击按钮,便会新启一个 Activity A1叠在刚才的A1之上,再点击,又会再新启一个在它之上……点 back 键会依照栈顺序依次退出。
2.singleTop
如果在回退栈的栈顶正好存在该 Activity 的实例,就重用该实例(会调用实例的 onNewIntent()),否则就会创建新的实例并放入栈顶(注,即使栈中已经存在该 Activity 的实例,只要不在栈顶,都会创建实例),即:不允许多个相同 Activity 叠加,保证 task 栈顶部有且只有一个 activity 实例对象
例如:
若我有两个Activity名为B1,B2,两个 Activity 内容功能完全相同,都有两个按钮可以跳到B1或者B2,唯一不同的是B1为standard,B2为singleTop。
若我意图打开的顺序为B1->B2->B2,则实际打开的顺序为B1->B2(后一次意图打开B2,实际只调用了前一个的 onNewIntent 方法)
若我意图打开的顺序为B1->B2->B1->B2,则实际打开的顺序与意图的一致,为B1->B2->B1->B2。和默认启动没区别..
3.singleTask
如果在栈中已经有该 Activity 的实例,就重用该实例(会调用实例的 onNewIntent ())。重用时,会让该实例回到栈顶,因此在它上面的实例将会被移除栈。如果栈中不存在该实例,将会创建新的实例放入栈中。
即:保证 task 栈中有且只有一个 activity 实例对象
4.singleInstance
在一个新栈中创建该 Activity 实例,并让多个应用共享该 Activity 实例。一旦这种模式的 Activity 实例存在于某个栈中,任何应用再激活这个 Activity 时都会重用该栈中的实例,其效果相当于多个应用程序共享一个应用,不管谁激活该 Activity 都会进入同一个应用中。此启动模式和我们使用的浏览器工作原理类似,在多个程序中访问浏览器时,如果当前浏览器没有打开,则打开浏览器,否则会在当前打开的浏览器中访问。此模式会节省大量的系统资源,因为他能保证要请求的 Activity 对象在当前的栈中只存在一个。
“launchMode”设置为”singleInstance”的 Activity 总是在栈底, 只能被实例化一次, 不允许其它的 Activity 压入”singleInstance”的 Activity 所在 Task 栈, 即整个 Task 栈中只能有这么一个 Activity。
注意: 虽然 activity 启动了一个新的 task,但用户仍然可以用回退键返回前一个 task。
即:只有一个实例,并且这个实例独立运行在一个 task 中,这个 task 只有这个实例,不允许有别的 Activity 存在。
例如:程序有三个ActivityD1,D2,D3,三个 Activity 可互相启动,其中D2为singleInstance模式。那么程序从D1开始运行, 假设D1的taskId为200,那么从D1启动D2时,D2会新启动一个task,即D2与D1不在一个task中运行。假设D2的taskId为 201,再从D2启动D3时,D3的taskId为200,也就是说它被压到了D1启动的任务栈中。
若是在别的应用程序打开D2,假设Other的taskId为200,打开D2,D2会新建一个task运行,假设它的taskId为201,那么如果这 时再从D2启动D1或者D3,则又会再创建一个 task,因此,若操作步骤为 other->D2->D1,这过程就涉及到了3个task了。
注:当应用中有三个 Activity 为 A、B、C,B启动模式为 singleInstance ,若此时启动顺序为
A > B > C ,那么此时按返回键 将回到 A,再按返回键 A 结束后 才会回到 B。即:只有当当前任务的回退栈中的所有 Activity 都结束 ,才会回到上一个任务...