activity的启动模式有四种standard、singleTop、singleTask、singleInstance。
如果对栈的概念理解的话再来看这四个启动模式会比较清晰,由其是singleTask和singleTop
需求任务栈:启动它的activity的任务栈或者它自己指定的任务栈。
activity指定任务栈可以通过taskAffinity标签去指定任务栈,如果没有指定那么默认为启动它的activity所在的任务栈
standard
standard模式是默认的启动模式,启动该模式下activity会在需求任务栈里创建一个实例。对!!!!无论如何它都会重新创建实例,activity会执行标准的生命周期onCreate、onStart、onResume。
singleTop
singleTop模式,系统会检查需求任务栈栈顶的activity是否为要启动的activity如果是则不会重新创建实例而是取栈顶activity然后执行onNewIntent和onResume方法。要注意的是这个时候activity的onCreate和onStart方法不会被调用,因为没有重新创建activity。如果栈顶的acitivty不是要启动的acitivty的话,那么就会重新创建一个activity压入栈顶中。
singleTask
singleTask启动模式是比较特殊的启动模式。因为自带clearTop。为什么自带clearTop?举个栗子,ABCD四个activity,D在栈顶,现在想把B移动到栈顶那就需要把CD移出栈,所以singleTask自带clearTop。singleTask里的single的概念对应的也是跟前面两个一样是需求任务栈中的single。例如有两个任务栈task1和task2,task1里有A(activity)是singleTask启动模式,task2没有A。现在task2里的一个acitivity去启动A,这时系统会重新创建一个A放到task2的栈顶,不会去重用task1里面的A。如果是task1里面的activity去启动A,那么A会被重用执行onNewIntent和onResume方法。
singleInstance
这是一个加强版本的singleTask,它会单独的运行在一个单独的任务栈中,这个任务栈中只有它。。。(霸道不!!!)。 单一实例,整个手机操作系统里面只有一个实例存在。不同的应用去打开这个activity共享 公用的同一个activity。由于栈内复用的特性,这个activity会一直被复用,直到这个任务栈被系统销毁。其他的地方跟singleTask一样。就不多做介绍了。
应用场景:呼叫来电界面 InCallScreen
名称 | 是否默认 | 清除在自己上面的activity | |
---|---|---|---|
standard | 是 | 否 | |
singleTop | 否 | 否 | |
singleTask | 否 | 是 | |
singleInstance | 否 | 是 |