1,standard:Activity默认加载方法,即使某个Activity在 Task中已存在,另一个activity通过Intent跳转到该activity,同样会新创建一个实例压入Task中。如:现在Task的情况为:A B C D,在D这个Activity中通过Intent跳转到D,那么现在的Task中情况为: A B C D D 。如果栈顶的D通过Intent跳转到B,则栈情况为:A B C D D B。这时候依次按返回键,D D C B A会依次弹出Task显示在界面上。
2,singleTop:某个Activity设置成singleTop,当该Activity位于Task顶的时候,通过Intent跳转到本身这个Activity,则将不会创建一个新的实例。例如:现在Task的情况为:A B C D。D的加载模式(Launch mode)设置成了singleTop,那么在D中启动Intent跳转到D,那么将不会新创建一个D的实例,此时Task的情况依然为:A B C D。但是如果此时B的模式也是singleTop,D跳转到B(B没有在Task的Top),则会新建一个B的实例压入栈中,因为此时B不是位于栈顶,此时Task就变成了:A B C D B。
3,singleTask:某个Activity是singleTask模式,那么Task栈中只有一个该Activity的实例。例如:现在栈的情况为:A B C D。B的加载模式(Launch mode)为singleTask,D通过Intent跳转到B,则栈的情况变成了:A B。而C和D被弹出销毁了,就是说位于B之上的实例都被销毁了。
4,singleInstance:将Activity压入一个新建的Task栈中。例如:Task栈1的情况为:A B C。C通过Intent跳转到D,而D的加载模式(Launch mode)为singleInstance,则将会新建一个Task栈2。此时Task栈1的情况还是为:A B C。Task栈2的情况为:D。此时屏幕界面显示D的内容,如果这时D又通过Intent跳转到D,则Task栈2中也不会新建一个D的实例,所以两个栈的情况也不会变化。而如果D跳转到C,则栈1的情况变成了:A B C C,因为C的加载模式(Launch mode)为standard,此时如果再按返回键,则栈1变成:A B C。也就是说现在界面还显示C的内容,不是D。 现在有一个问题就是这时这种情况下如果用户点击了Home键,则再也回不到D的即时界面了。如果想解决这个问题,可以为D在Manifest.xml文件中的声明加上<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
加上这段之后,也就是说该程序中会有两个这种声明,另一个就是那个正常的根主activity,在打成apk包安装之后,在程序列表中能看到两个图标,但是如果都运行的话,在任务管理器中其实也只有一个。上面的情况点击D的那个图标就能回到它的即时界面(比如一个EditText,以前输入的内容,现在回到之后依然存在)。