写在最前面的话,前几天一个前辈问我启动模式的问题,工作这么长时间,说实话,经常用的也就
singleTop
singleTask
,让我遇到具体的问题了呢,我知道该使用哪种启动模式解决,有时候真说,还说不出来。结果就悲剧了,挺尴尬的,所以决定写篇文章结合自己的实际操作来细细说来。
- Standard模式(默认)
这个模式我就不多说了,系统默认的启动模式,也没什么特别的地方,每次启动一个Activity
都会创建一个实例。
我们重点说下
singleTop
singleTask
- SingleTop
字面上的意思呢就是:如果要在当前页面启动一个的Activity
,系统首先会判断这个Activity
是不是位于栈顶,如果刚好是,那么系统就不会重新创建Activity
,反之则会重新创建Activity
的实例,下面我们来模拟这样一个场景:
有三个Activity 分别是 A B C 启动顺序为:A→B→C 把A的启动模式修改为SingleTop
那么再次启动A ,栈里的顺序是什么样的?
![Upload notify5.gif failed. Please try again.]
首先栈里的初始信息肯定是这样的:
如果我们再次启动A ,我们看打印信息:
从打印的日志可以看出A是重新又在栈里重新创建了,因为我们前面说过singleTop
模式会判断A是否在栈顶,如果在就重新启动,不在就重新创建,那么现在我们把C改为singleTop
,然后在C页面重新C,我们看打印结果:
果不其然,这个C不会再重新创建的,因为C此时在栈顶,直接就利用C,不会重新创建。经过我亲自实验,大家应该就清楚了,这种启动模式一般能解决什么问题呢,比如:当我们快速点击button跳转界面的时候,可能会同时启动两个相同的 Activity
,如果你把启动模式修改singleTop
就不会出现两个一样的。
- SingleTask
简单的来讲呢,启动模式为此种的Activity
,系统也是会首先判断是否位于栈顶,没有位于栈顶,如果在栈里已经存在,但是并没有在栈顶,则会把他之上的Activity
全部清除掉,使自己位于栈顶,还是上面的A→B→C,到C页面后重新打开A,A 是singleTask ,我们来看下打印信息:
当重新在C界面跳入A页面的时候,会发现,B,C出栈了,使A位于栈顶。
- singleInstance
这个我在开发中几乎没有用到过,可以用一张图来说明它的任务栈情况,我们设定B为singleInstance,如下图所示:
这下可明白多了,你有没有觉着呢?哈哈哈哈哈哈哈哈哈哈哈哈......