tips:用getTaskId()
来获取当前任务的Id
使用一个按钮来启动自己
startActivity(new Intent(MainActivity.this,MainActivity.class));
通过AndroidManifest.xml中Activity节点设置启动模式
android:launchMode=xxx
standard模式
可以发现,TaskId都是55,而Activity的Id(通过toString()
)则每一次都不同,说明都在同一个任务栈里,只是创建了不同的实例,按后退键会显示之前的不同实例。也就是说在这个55号栈里,堆叠着刚才按钮启动的许多个Activity实例,按照先进后出的原则存在,例如323979d这个实例就在6556ef1的实例上面。
singleTop模式
在此模式下,用单独一个Activity测试,启动自身的话TaskId和实例都是同一个,未曾变化,因为栈里面只有一个实例,它是栈顶,所以不创建新的实例
新建第二个Activity再作测试(同样配置singleTop启动)
and两个不同的Activity中的控件取相同的名字是没关系的
1、测试A跳到B,B跳到自身
可以看到,A跳到B时创造了新的实例,B跳到自身没有创造新的实例,栈中从下至上有A1,B1实例。
2、测试A跳到A,A跳到B,B跳到A
A1->A1
A1->B1
B1->A2
这时A的序号已经发生了变化,因为从B去启动A时,栈顶实例是B,所以启动A时新建一个实例A2,此时栈里面从下至上有A1,B1,A2
singleTask模式
将A的启动模式改为singleTask,尝试A->B->A
栈中:A1
栈中:A1、B1
栈中:A1
可以看到这两个A是同一个id,因为此模式下,从B启动A,会将栈中其他实例弹出,直接启动最开始的这个A,在最后一张图的时候,回退,会直接退出程序,因为此时栈中只有A1这个实例了。
singleInstance模式
将A改为singleInstance模式启动,还是按照上次的方式进行测试
可以清楚看到,A和B已经不再是在同一个栈里了,一个栈里面只有一个实例,最后一张图的时候如果后退,会退回B,再后退就回到桌面了。这个模式和其他三个模式都不同,实例不存放在相同的任务栈。