Activity四种启动模式详细整理
1.Standard
standard模式,顾名思议就是标准启动模式,默认启动模式。
一个Activity如果不知道它的启动模式,那么它就是按Standard模式启动。如果多次启动一个Activity,会生成多个实例,按顺序放在同一个任务栈中,当你按返回键时,会从移除任务栈顶部的Activity,遵循栈的后进先出的基本原则。直到这个任务栈里所有的Activity都被移除,也就是栈已经空了,系统就会回收掉这个任务栈。
2.SingleTop
SingleTop 栈顶复用模式
栈顶复用,顾名思义就是说当栈顶存在这个Activity的实例时,不会创建新的实例,而是直接复用这个实例,此时不会调用Activity的onCreate()、onStart(),但是会调用onNewIntent()方法,我们可以在该方法中处理需要改变的数据。
当然,如果在该任务栈中有这个Activity的实例,但是该实例不在栈顶,那么还是会重新创建一个实例,并压入栈顶。
singleTop模式分3种情景
当前栈中不存在该Activity的实例时,其行为同standard启动模式
当前栈中已有该Activity的实例但是该实例不在栈顶时,其行为和standard启动模式一样,依然会创建一个新的实例
当前栈中已有该Activity的实例并且该实例位于栈顶时,不会新建实例,而是复用栈顶的实例,并且会将Intent对象传入,回调onNewIntent()方法
下图可以涵盖所有这三种情景下的任务栈的情况
3.SingleTask
SingleTask–栈内复用模式
在这个模式下,如果栈中存在这个Activity的实例就会复用这个Activity,不管它是否位于栈顶,复用时,会将它上面的Activity全部出栈,并且会回调该实例的onNewIntent方法。其实这个过程还存在一个任务栈的匹配,因为这个模式启动时,会在自己需要的任务栈中寻找实例,这个任务栈就是通过taskAffinity属性指定。如果这个任务栈不存在,则会创建这个任务栈。
下面先来讲一讲taskAffinity属性。
一般情况下,同一个app里面启动的Activity都会在同一个任务栈里面。前提是我们没有为Activity指定特殊的任务栈。
每个Activity都有taskAffinity属性,这个属性指出了它创建时要进入的任务栈。如果一个Activity没有显式的指明该 Activity的taskAffinity,那么它的这个属性就等于Application指明的taskAffinity,如果 Application也没有指明,那么该taskAffinity的值就等于包名。而任务栈也有自己的affinity属性,它的值等于它的根 Activity的taskAffinity的值,即第一个入栈的Activity的taskAffinity的值,无论后面入栈的Activity的taskAffinity是啥,都不会改变。
下面同样用一张图来简单表示SingleTask模式下的情景
4.SingleInstance
SingleInstance–单实例模式,也叫全局唯一模式
该模式具备singleTask模式的所有特性,与它的区别就是,这种模式下的Activity会单独占用一个Task栈,具有全局唯一性,即整个系统中就这么一个实例,由于栈内复用的特性,后续的请求均不会创建新的Activity实例,除非这个特殊的任务栈被销毁了。以singleInstance模式启动的Activity在整个系统中是单例的,如果在启动这样的Activiyt时,已经存在了一个实例,那么会把它所在的任务调度到前台,重用这个实例。合格
以上内容为本人在工作之余整理所成,希望对初学者有所帮助,如有错误之处,烦请指正,谢谢!