深入理解Activity的启动模式

众所周知,当我们多次启动同一个Activity时,会创建多个该Activity的实例,系统会按照先进后出的原则,将它们一一放进任务栈中,然后我们按back键,系统就会将栈顶的Activity移除栈,直至栈中没有Activity,系统就会回收这个任务栈。这就是默认的Activity启动模式:standard模式。在该模式下,每次启动Activity都会创建一个新的实例,不利于内存的利用,这种做法显然不合理,为了优化这个问题,Android提供4种Activity启动模式,在不同的情况下选择不同的复用机制避免出现实例重复创建问题。

进入正题,Acticity的启动模式如下:

standard、singleTop、singleTask、singleInstance

1、standard(标准模式)

这是系统的默认启动模式,不管这个Activity的实例是否存在于任务栈中或者和启动它的Activity是否在相同的任务栈中,每次启动Activity都会创建一个新的实例。这样创建的Activity会依次执行onCreate、onStart、onResume生命周期方法。这种情况下,谁启动了它,它就属于启动它的Activity的任务栈中,例如MainActivity启动MainActivity2,MainActivity2就会位于MainActivity所在任务栈的栈顶。具体查看日志的方法如下:adb shell dumpsys activity ,我们只看 Running activities (most recent first): 部分。

Running activities (most recent first):
  TaskRecord{baa1051 #2748 A=me.bakumon.launchmode U=0 StackId=1 sz=2}
    Run #12: ActivityRecord{1d38839 u0 me.bakumon.launchmode/.Main2Activity t2748}
    Run #11: ActivityRecord{6a0be5 u0 me.bakumon.launchmode/.MainActivity t2748}

说明 Main2Activity 和 MainActivity 位于相同的栈:#2748,并且 Main2Activity 位于栈顶。

2、singleTop(栈顶复用模式)

这个模式下,如果Activity的实例已经存在在栈顶,启动它就不会再创建新的实例,而是会调用onNewIntent,通过此方法的参数我们可以去除当前请求的信息。随后会调用onResume方法,不再调用onCreate、onStart方法,因为它没有变化。如果没有存在的话,就会如同standard模式一样。这种模式可以用来防止多次打开同一个Activity

 

对于以上的两种模式总结下:

standard和singleTop启动模式都是在原任务栈中新建Activity实例,不会启动新的Task,即使你指定了taskAffinity属性。taskAffinity属性标识了一个Activity所需任务栈的名字,默认情况下,所有Activity所需的任务栈的名字为应用的包名。重要的是即使设置了taskAffinity属性,对standard和singleTop模式不会有任何影响,这两种启动模式下不会创建新的task。

 

3、singleTask(栈内复用模式)

在这个模式下,如果栈内存在该Activity的实例,不管是否存在于栈顶都不会再创建实例,而是会将该实例前的Activity清出栈顶(cleanTop),并且会回调onNewIntent方法。其实在这个过程中,首先是会进行任务栈的匹配,这个任务栈就是通过taskAffinity属性指定,如果不存在这个任务栈,就会创建一个任务栈,并将该Activity放入栈中。流程图比较清晰,如下所见:

4、singleInstance(全局唯一模式)

该模式具备singleTask模式的所有特性外,与它的区别就是,这种模式下的Activity会单独占用一个Task栈,具有全局唯一性,即整个系统中就这么一个实例,由于栈内复用的特性,后续的请求均不会创建新的Activity实例,除非这个特殊的任务栈被销毁了。以singleInstance模式启动的Activity在整个系统中是单例的,如果在启动这样的Activiyt时,已经存在了一个实例,那么会把它所在的任务调度到前台,重用这个实例。 

 

参考链接:

http://blog.csdn.net/mynameishuangshuai/article/details/51491074

https://juejin.im/post/591bd09a2f301e006bcd6e43

 

posted @ 2017-05-22 18:06  ha_cjy  阅读(1083)  评论(0编辑  收藏  举报