关于Activity的4种launchMode

来源:互联网 发布:你见过最恐怖的事 知乎 编辑:程序博客网 时间:2024/06/13 22:33

关于Activity的4种launchMode

启动的每个Activity都要在AndroidManifest.xml中配置,否则就会报错.
这是我在测试中SingleInstanceActivity的配置代码:

<Activity android:name=".SingleInstanceActivity"            android:launchMode="singleInstance"            android:screenOrientation="portrait"            />

很简单,就配置了Activity的名字和orientation(portrait:竖屏),以及launchMode.
Activity的launchMode一共有4种,默认是standard.

  • standard
  • singleTop
  • singleTask
  • singleInstance

这是我测试应用的主界面截图:
程序主界面

standard

这是Activity默认的启动方式,这种启动模式下,被启动的Activity无论Activity栈中是否已经有实例,实例是否在栈顶,它都会生成一个新的Activity实例,然后压如栈顶.

  • 如果之前栈中没有该Activity的实例,那它就会创建一个实例,然后压入Activity栈顶
    创建实例额然后压入栈顶

    此时栈底是MainActivity,栈顶是StandardActivity,这种情况下继续启动一个standard模式的Activity,尽管栈中已经有个StandardActivity的实例,无论是否在栈顶(singleTop会受是否在栈顶的影响),都会重新创建一个新的实例,然后压入栈顶.
    这里写图片描述
    这里写图片描述
    从图中我们可以看到两次显示的StandardActivity内存地址不一样,说明在一共创建了2次实例,至于taskId,可以理解成该Activity栈的id,由于是同一个栈,所以id相同.
    此时按下返回键,会把栈顶的Activity弹出栈,回到第一次启动的StandardActivity页面

singleTop

singleTop和standard非常类似,唯一的区别就是如果当前栈中已经有该Activity的实例,并且该实例在栈顶,那么就不会重新创建实例,而是调用Activity的onNewIntent(Intent intent)方法.
在主界面第一次启动SingleTopActivity,和standard一样,如图:
这里写图片描述
这里写图片描述
此时,再次启动一个SingleTopActivity,程序会发现当前栈顶的Activity已经是SingleTopActivity了,就不会重新创建实例,而是调用onNewIntent重新刷新数据,所以栈里面还是只有2个Activity,MainActivity在栈底,SingleTopActivity在栈顶.
如果这时候,我们先启动一个StandardActivity然后在启动一个SingleTopActivity,那情况就不一样了,由于第二次启动SingleTopActivity的时候,之前的SingleTopActivity实例已经不在栈顶了,所以程序会再次创建一个新的SingleTopActivity实例,然后压入栈顶.
这里写图片描述启动StandardActivity后栈情况
这里写图片描述第二次启动SingleTopActivity的栈情况
这里写图片描述
二次启动的SingleTopActivity显示的内存地址不一样,说明实例化了2次.

singleTask

启动singleTask模式的Activity,如果当前的栈中没有该Activity的实例,那就和standard模式一样,创建实例,然后压入栈顶
这里写图片描述
这里写图片描述
如果这时候再次启动一个SingleTaskActivity,由于栈中已经有实例,并且在栈顶,所以只会调用onNewIntent方法.
但是如果我们在第二次启动SingleTaskActivity之前,先启动一个别的Activity,让这个SingleTaskActivity实例不在栈顶,然后再启动SingleTaskActivity,程序发现当前栈中已经有个SingleTaskActivity的实例了,但是它不在栈顶,这时候它会把栈中所有在它上面的Activity弹出栈,让自己处于栈顶位置,然后调用onNewIntent方法,不会创建新的实例,也就是说启动一个SingleTaskActivity,如果栈中已经有该Activity的实例,那它会想方设法让自己处于栈顶的位置(把在它上面的全都推出栈).
这里写图片描述期间先启动一个别的Activity
然后在启动SingleTaskActivity
这里写图片描述这里写图片描述

singleInstance

singleInstance模式的Activity意味着该Activity会独享一个栈(该栈不允许存在其他的Activity实例)
假设刚开始默认的栈为stack1,启动一个SingleInstanceActivity,那它会重新创建一个Activity栈(前面提到的taskId会发生变化)stack2,然后创建Activity实例压入stack2,应用切换stack2为应用的任务栈.这时候不同的操作会有不同的结果:
1.继续启动一个SingleInstanceActivity(类名相同,模式相同),不会创建新的栈,也不会创建新的实例.

2.继续启动一个其他的Activity(类名不同,模式相同),会创建新的stack3栈,也会创建新的Activity实例.

3.继续启动一个其他的Activity(类名不同,模式不同:非singleInstance),不会创建新的栈,是否创建新的Activity实例和该Activity的模式有关,SingleInstanceActivity不会被销毁,应用切换stack1为应用的任务栈,此时再启动一个SingleInstanceActivity,不会创建新的栈和新的实例,而是应用切回stack2.

4.主动返回(按返回键),SingleInstanceActivity会被销毁,应用切换stack1为应用的任务栈,此时再启动一个SingleInstanceActivity,会创建新的栈stack3,和新的Activity实例.

总结

standard:每次启动都创建实例,所以该模式下的同一个Activity在栈中会有多个实例.
singleTop:仅当栈中有该Activity的实例,并且该实例在栈顶的情况下不会创建新的实例,其他情况下都会创建新的实例,所以可能存在多个实例.
singleTask:如果栈中已经有实例了,则将该实例以上的Activity实例全都弹出栈,所以栈中始终只有一个实例.
singleInstance:如果有实例则应用任务栈切换到该实例的栈;如果没有则先创建一个栈(taskId变化),然后创建Activity实例压入栈,该栈只允许存在这么一个Activity实例,最后应用的任务栈切换到该栈,所以该模式的Activity只有一个实例.

ps:如果有不对的地方欢迎指正!转载请保留出处,谢谢.
http://blog.csdn.net/Tim_bin/article/details/44753341

0 0