activity有四种静态启动模式,分别是:默认启动模式standard;栈顶复用模式singleTop;栈内复用模式singleTask;全局唯一模式singleInstance;
默认启动模式standard
顾名思义这个模式就是默认的启动模式,也是最容易理解的启动模式。
从这张图可以很清晰的看出standard模式就是简单的栈的进栈和出栈,先进后出。
栈顶复用模式singleTop
singleTop,栈顶复用模式意思就是说如果这个activity是在栈顶,再次启动这个activity就直接复用,不创建新的activity。
图中activity2是singleTop模式,可以看出当activity2在栈顶部的时候,再次启动activity2,没有创建新的activity,而是直接复用了当前的activity2.
栈内复用模式singleTask
与singleTop类似,只不过singleTop只是复用栈顶的元素,而singleTask可以复用栈内的所有元素,当启动的activity在栈内已经存在时,singleTask模式直接弹出目标activity之上的所有元素,讲目标元素置于栈顶。
activity1是singleTask模式,当再次启动activity1的时候,栈内已经存在目标activity(activity1),则弹出activity1之上的所有activity,讲目标置于栈顶。
应用场景:
程序主界面,我们肯定不希望主界面被多创建,而且在主界面退出的时候退出整个App是最好的设想。
耗费系统资源的Activity:对于那些及其耗费系统资源的Activity,我们可以考虑将其设为singleTask模式,减少资源耗费(在创建阶段耗费资源的情况,个人理解-。+)
全局唯一模式singleInstance
这是我们最后的一种启动模式,也是我们最恶心的一种模式:在该模式下,我们会为目创建一个新的Task栈,将目标Activity放入新的Task,并让目标Activity获得焦点。新的Task有且只有这一个Activity实例。 如果已经创建过目标Activity实例,则不会创建新的Task,而是将以前创建过的Activity唤醒(对应Task设为Foreground状态)。
为了方便理解,也为了与standard模式融会贯通,我在下图中activity1和activity2使用的是standard模式,而activity3使用的是singleInstance模式
动态设置启动模式
在上述所有情况,都是我们在Manifest中设置的(通过launchMode属性设置),这个被称为静态设置(我们写程序写多了会发现有静态就有动态,而且静态多数在xml设置,动态在java代码设置),接下来我们来看一下如何动态的设置Activity启动方式。
注):如果同时有动态和静态设置,那么动态的优先级更高。
intent.setFlags(、、、、、);
动态设置启动模式就是利用Intent启动activity的时候,设置flag。
常见的几种flag
Intent.FLAG_ACTIVITY_NEW_TASK
这个Flag跟我们的singleInstance很相似:在给目标Activity设立此Flag后,会根据目标Activity的affinity进行匹配:如果已经存在与其affinity相同的task,则将目标Activity压入此Task。 反之没有的话,则新建一个task,新建的task的affinity值与目标Activity相同。然后将目标Activity压入此栈。
其实简单来说,就是先看看需不需要创建一个新的Task,根据就是有没有相同的affinity。然后把Activity放进去。
但是此情况和singleInstance有不同,有两点注意的地方:
1. 新的Task没有说只能存放一个目标Activity。只是说决定是否新建一个Task。而singleInstance模式下新的Task只能放置一个目标Activity。
2. 在同一应用下,如果Activity都是默认的affinity,那么此Flag无效。而singleInstance默认情况也会创建新的Task。
Intent.FLAG_ACTIVITY_SINGLE_TOP
和静态中的singleTop效果相同
Intent.FLAG_ACTIVITY_CLEAR_TOP
和静态中国呢的singleTask类似
当设置此Flag时,目标Activity会检查Task中是否存在此实例,如果没有则添加压入栈,
如果有,就将位于Task中的对应Activity其上的所有Activity弹出栈,此时有以下两种情况:
- 如果同时设置Flag_ACTIVITY_SINGLE_TOP,则直接使用栈内的对应Activity,
- 没有设置。。。。。。。,则将栈内的对应Activity销毁重新创建。
_CLEAR_TOP和_SINGLE_TOP同时设置的情况下,就是singleTask模式。
而唯一不同的一点就在于:他会销毁已存在的目标实例,再重新创建。