刚学习Android之时,就知道Activity有四大启动模式:
standard:标准模式,每次都会在栈里新建一个activity实例。
singleTask:当该activity实例已存在在栈内时,会复用其实例,并将其顶上的其余activity实例移除。
singleTop:当该activity已存在于栈顶时,则复用其实例。
singleTask:栈内永远就只有一个实例。
这是最开始对四大启动模式的理解,每次面试时背的滚瓜烂熟,看起来是对的,但是用起来千差万别。
理解的差异在于:“栈内”
大家都知道,当一个app启动的时候,系统会为此app创建一个进程(至少创建一个,因为有可能是多个,有的app服务端service单独运行在另一个进程,此项可以在mainfest里面设置),然后创建并进入的第一个Activity,此时就会创建一个栈,并往其里面添加第一个实例,后面启动另外其余的activity时,都是往栈内添加实例。这种情况在standard / singleTask / singleTop 的模式下是使用的,但是当碰到singleTask的时候,就会出现另一种情况,会重新建立一个栈,其栈中就只有一个实例。这也就导致了一个app里面有至少2个以上的栈。
当一个app里面出现了两个栈情况怎么样呢,细究之下就很有趣了。
但是当从B按Home键返回到主界面,然后再次点击APP图标,会进入哪?
答案是A界面。(Main,A是standard模式)
因为从主界面进入会到带LAUNCHER的Activity的栈顶(正常情况),但是B在另外一个栈,故只会到A结束。
ps:如果Main是SingleTask模式的话,又会请况不一样,当其进入第一个栈时,从下往上,发现了SingleTask的Activity,就会调用其onNewIntent(),重走其方法,并移除栈顶的其余实例。上面的情况就变成了回到MainActivity
正常的Main —- A —- B 然后一步步onBackPressed是怎样情况呢:
从主界面进入:
首先就有三个栈堆叠了:
然后onBackPressed时候,先finish掉B,Task03就清空销毁了,就到了Task02,然后finish掉A和MainActivity,Task02就清空销毁了,就直接到了HomeLaunch。
原理就是这样:主要就是因为不在一个栈内。以上演示的例子设定的Main 和 A 的启动模式为standard,如果为SingleTask,又得另行分析了,只是说明以后碰到这样的问题,大家可以了解大概,然后可以通过简单实例去选择自己合适的启动模式。慎用启动模式。