看过很多关于Activity的启动模式讲解的文章, 一般都是使用打印, 图解来说明, 结果越说明越乱, 完全不知所云, 偶然找到一篇文章, 清晰简洁的描述出了Activity的启动模式. 链接见:
看之前, 建议先了解Android关于Activity栈的概念, 这样理解起来就会很容易了.
/*********************************** 转载分割线 **************************************/
1、Activity有几种加载启动模式呢?
其实对于答案,我相信大家都知道,一共有四种加载模式,对于这四种模式,我相信大家肯定也有过一定的了解,但是我相信很多人在不用之后,会逐渐忘记,或许会弄混。
Activity有四种加载模式,分别为:standard(默认), singleTop, singleTask和 singleInstance。
2、这几种模式都是什么意思?该怎么用呢?
这四种模式分别在不同的要求时,有自己不同的用法,掌握好了,了解了具体意思我们就能在开发过程中非常方便的使用。现在我逐一举例解释它们的意思呵区别:
standard:Activity的默认加载方法,即使某个Activity在Task栈中已经存在,另一个activity通过Intent跳转到该activity,同样会新创建一个实例压入栈中。例如:现在栈的情况为:A B C D,在D这个Activity中通过Intent跳转到D,那么现在的栈情况为: A B C D D 。此时如果栈顶的D通过Intent跳转到B,则栈情况为:A B C D D B。此时如果依次按返回键,D D C B A将会依次弹出栈而显示在界面上。
singleTop:如果某个Activity的Launch mode设置成singleTop,那么当该Activity位于栈顶的时候,再通过Intent跳转到本身这个Activity,则将不会创建一个新的实例压入栈中。例如:现在栈的情况为:A B C D。D的Launch mode设置成了singleTop,那么在D中启动Intent跳转到D,那么将不会新创建一个D的实例压入栈中,此时栈的情况依然为:A B C D。但是如果此时B的模式也是singleTop,D跳转到B,那么则会新建一个B的实例压入栈中,因为此时B不是位于栈顶,此时栈的情况就变成了:A B C D B。
singleTask:如果某个Activity是singleTask模式,那么Task栈中将会只有一个该Activity的实例。例如:现在栈的情况为:A B C D。B的Launch mode为singleTask,此时D通过Intent跳转到B,则栈的情况变成了:A B。而C和D被弹出销毁了,也就是说位于B之上的实例都被销毁了。
singleInstance:将Activity压入一个新建的任务栈中。例如: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。
3、总结
说完第二部分,我相信我解释的已经很清楚了,也非常明白,我可以明确的告诉你,在一个复杂的应用程序中,这几种模式非常重要,能够用到,这个问题也是经常在笔试或者面试当中被常问,而大家又不是太清楚的一个问题。所以学东西不能一知半解,要深入了解原理和用意之后,我们才能非常好的使用它。
/****************************** 我的理解 ****************************/
standard: 启动一个Activity, 不管三七二十一, 立马就给你新建一个, ==> 果然爽快, :)
singleTop: 启动一个Activity, 如果在栈顶, 那么复用, 否则就新建一个 ==> 只看了眼前的利益, O(∩_∩)O
singleTask: 启动一个Activity, 没有存在就新建一个, 存在了, 那么将在它上面的全部销毁, 让自己成为栈顶 ==> 挺霸道的, (⊙o⊙)
singleInstance: 启动一个, 如果没有存在, 就新建一个栈, 让自己在栈中待着, 如果已经存在了, 跳转到该栈中, 反正这个栈就我一个 ==> 果然是孤家寡人,