作为一个好的开发人员,不应该忽视掉Activity的启动方式launchMode。每次新建Activity时,内心都要问问自己这个界面启动场景是什么,它应该适应于哪种启动方式?如果要快速灵活的解决上述问题,我们需要对launchMode的四种启动方式了然于胸。下面我会逐一通过简洁的语言介绍它们的意义,同时使用一句话来总结它们各自的特性,帮助我们迅速了然于胸。
如果不对新建的Activity不做任何修改,它在清单文件中默认的launchMode为standard
1<activity
2 android:name=".MainActivity"
3 android:launchMode="standard">
4</activity>
亦或者直接没有launchMode,但内部默认还是standard。大家都知道我们启动的Activity的保存在stack中,假设当前Activity堆栈为
此时我为B添加launchMode="standard",并且在D中启动B,此时Activity堆栈为
所以standard模式表现为:不关心当前Activity堆栈,它总会新增一个实例加入当前堆栈中。
1.还是之前的Activity堆栈
现在我对C添加launchMode="singleTop",并在D中启动C,此时的Activity堆栈为
这种情况表现方式与默认的standard模式一致
2.如果我将之前的Activity堆栈稍作修改
再次启动C,此时Activity堆栈为
3.如果之前的Activity堆栈中没有C
再次启动C,此时Activity堆栈为
这种情况表现方式与默认的standard模式一致
所以singleTop模式表现为:只关心当前Activity堆栈的栈顶是否存在它的类型实例,如果有则不新建实例;否则新建实例
1.当前Activity堆栈为
现在我对C添加launchMode="singleTask",并在D中启动C,此时Activity堆栈为
D会被从Activity堆栈中移除,然后再复用之前的实例
2.当前Activity堆栈为
再次启动C,此时Activity堆栈为
这种情况表现方式与singlTop模式一致
3.当前Activity堆栈为
再次启动C,此时Activity堆栈为
这种情况表现方式与默认的standard模式一致
所以singleTask表现为:只关心当前Activity堆栈中是否存在它的类型实例,如果有则先将它顶部所有堆栈实例出栈,使其回到栈顶,再复用当前栈顶实例,否则新建实例
1.当前Activity堆栈为
现在我为E添加launchMode="singleInstance",然后在D中启动E,此时Activity堆栈为
第一个Activity堆栈
第二个Activity堆栈
你会发现E不存在于之前的堆栈中,而是新开一个Activity堆栈。
2.如果在1的结果基础上,我在E中继续启动F,此时Activity堆栈为
第一个Activity堆栈
第二个Activity堆栈
后续启动的实例还是会加入到之前的Activity堆栈中。
3.当前Activity堆栈为
第一个Activity堆栈
第二个Activity堆栈
现在我在D中启动E,此时Activity堆栈为
第一个Activity堆栈
第二个Activity堆栈
E已经处于单独的Activity堆栈中,不会再新建实例
所以singleInstance表现为:只关心自己是否处于单独的Activity堆栈中,即堆栈中只能有它一个实例,也不新加其它实例;否则新开Activity堆栈
希望通过这种方式,你已经对这四种启动模式有了全新的理解。
最后我想问的是:你是否已经了然于胸了?