在 android 开发中,离不开 activity,而且使用 activity 就必须掌握 activity 的启动模式,下面就记录一下本人对 activity 四种启动模式的理解,方便以后复习!
activity 四种启动模式分别为standard、singleTop、singleTask、singleInstance:
1、standard activity 默认启动模式,该模式下,每当 activity 启动时都会在启动它的 activity 所在的 task 中创建一个新的实例,多次创建时,创建多个实例。 每当按 back 键返回的时候,会将栈顶的实例弹出,如果不断按 back,会依次弹出多个实例。
2、singleTop 栈顶复用,该模式下,如果当前 task 中有该 activity 实例,并且处于栈顶,那么不会创建新的实例,而直接复用顶部实例,并且会将Intent对象传入,回调onNewIntent方法。
如果当前 task 中有该 activity 实例,但是不处于栈顶,那么会和 standard 一样新创建 activity 实例。
如果 当前 task 中没有 activity 实例,其行为通 standard 模式。
standard和singleTop启动模式都是在原任务栈中新建Activity实例,不会启动新的Task,即使你指定了taskAffinity属性。
3、singleTask 栈内复用 singleTask启动模式启动Activity时,首先会根据taskAffinity去寻找当前是否存在一个对应名字的任务栈
如果不存在,则会创建一个新的Task,并创建新的Activity实例入栈到新创建的Task中去
如果存在,则得到该任务栈,查找该任务栈中是否存在该Activity实例
如果存在实例,则将它上面的Activity实例都出栈,然后回调启动的Activity实例的onNewIntent方法
如果不存在该实例,则新建Activity,并入栈。此外,我们可以将两个不同App中的Activity设置为相同的taskAffinity,这样虽然在不同的应用中,但是Activity会被分配到同一个Task中去。
4、singleInstance 该模式具备singleTask模式的所有特性外,与它的区别就是,这种模式下的Activity会单独占用一个Task栈,具有全局唯一性,即整个系统中就这么一个实例,由于栈内复用的特性,后续的请求均不会创建新的Activity实例,除非这个特殊的任务栈被销毁了。以singleInstance模式启动的Activity在整个系统中是单例的,如果在启动这样的Activiyt时,已经存在了一个实例,那么会把它所在的任务调度到前台,重用这个实例。