Activity启动方式有四种,分别是:
standardsingleTop
singleTask
singleInstance
我们可以在AndroidManifest.xm配置<activity />的Android:launchMode属性为以上四种之一即可;默认为standard模式;
1、standard
默认模式。在这种模式下,不管有没有已存在的activity实例,都会重新创建一个新的activity实例压入栈中。
例如 有一个activity为A,A中有一个按钮,点击跳转到A;这样每次点击按钮,都会新建一个activity A压入activity栈中,按back键按照栈的次序依次退出;
2、singleTop
当需跳转的activity处于栈顶,则不会创建新的实例,而是调用onNewIntent()方法;若不处于栈顶,则会新建实例。
例如:两个activity A、B;A为singleTop模式,B为standard模式;
A跳转到B时,新建一个B实例;B再跳转到A,还会新建一个A实例(因为A不处于栈顶),此时activity栈为:A-B-A;
然后A再跳转A,此时由于A处于栈顶,则不会新建A实例,而是调用A的onNewIntent()方法,此时activity栈为:A-B-A;
3、singleTask
栈中只有此activity的一个实例;
在同一个应用程序启动它时,若不存在,则新建一个实例;若存在,则把栈中在其之上的activity destroy掉并调用其onNewIntent()方法。
在别的应用程序启动它,则会新建一个task,并在该task中启动这个activity;singleTask允许别的activity与其在同一个task中,即如果我在这个singleTask的实例中打开一个新的activity,新启动的activity与此singleTask的activity在同一个task中。
例如:
同一个应用程序:有三个activity A、B、C B为singleTask,A、C为standard
A跳转到B,此时会新建一个B实例,栈为:A-B;
B跳转到C,此时会新建一个C实例,栈为:A-B-C;
C跳转到B,此时会移除B之上的activity,然后调用B的onNewIntent()方法,栈为:A-B;
A应用程序有两个activity D、F 都为standard;B应用程序有一个activity G 为singleTask模式;
假设A程序的taskId为200,启动一个D;然后D启动G,这时会新建一个task 201,G处于201这个task中,然后通过G启动一个F,F也处于201这个task中;此时按home键,然后在点击A程序,此时展示的是D界面;
4、singleInstance
新建一个task,且此task中只有这一个activity实例,不允许其他activity存在此task中;
例如:
程序有三个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了。
参考文档:
http://blog.csdn.net/shinay/article/details/7898492
http://blog.csdn.net/liuhe688/article/details/6754323