android 中,在使用Intent启动Activity时,我们可以使用两种方式对于Activity的启动模式进行规定,最常用的是在manifest文件中声明,Activity的启动模式分为四类:
activity启动之后会放入任务栈中,任务栈遵循后进先出的原则,
1)standard 标准模式,使用该启动模式时,每次都会新创建activity实例,并加入到任务栈中,新创建的activity都置于栈顶。
2)singleTop 模式,使用该启动模式时,如果要启动的activity刚好位于栈顶,则不需要重新创建activity实例,会复用该栈顶实例,并且调用onNewIntent方法重启该activity。
3)singleTask 模式,使用该启动模式时,当启动目标activity时,需要查看当前任务栈中是否存在目标Activity实例,如果存在,会将此Activity置于栈顶,原先在该activity上方的activity都会被移出任务栈。
4)singleInstance模式,使用该启动模式时,当启动目标activity时,查看目标activity是否存在,如果不存在,则需要新创建一个任务栈,并将这个activity单独放入这个栈中,如果目标activity存在,则直接调用相应任务栈中的相应的activity。
了解了manifest中的启动模式规则,就不得不提到,如何在代码中设置activity的启动模式。
代码中设置启动模式的方法就是,通过给intent设置flag属性,进而达到控制启动模式的目的,下面了解一下几种常见的flag,与他们在代码中的取值与说明。
(1)Intent.FLAG_ACTIVITY_NEW_TASK 开启一个新任务,flags默认该值,该值类似于lanchMode="standard",不同之处在于,如果原来不存在活动栈, FLAG_ACTIVITY_NEW_TASK 就会创建一个新栈。
(2)Intent.FLAG_ACTIVITY_SINGLE_TOP 当栈顶为待跳转的activity实例时,重用栈顶的实例,该值等同于lanchMode="singleTop"。
(3)Intent.FLAG_ACTIVITY_CLEAR_TOP 当栈中存在待跳转的Activity实例时,重新创建一个新实例,并将原实例上方的所有实例加以清除,该值与 lanchMode="singleTask" 类似,但是 lanchMode="singleTask" 采用onNewIntent启用原任务,而 FLAG_ACTIVITY_CLEAR_TOP 采用先onDestroy再onCreate创建新任务。
(4)Intent.FLAG_ACTIVITY_NO_HISTORY 该标志与lanchMode="standard"类似,但是栈中不保存新启动的activity实例,这样下次无论以何种方式再启动该实例,也要走standard完整流程。
(5)Intent.FLAG_ACTIVITY_CLEAR_TASK 该标志非常暴力,跳转到新页面时,栈中的所有实例被清空,注意,该标志需要结合 FLAG_ACTIVITY_NEW_TASK 使用,即setFlags的参数为 Intent.FLAG_ACTIVITY_CLEAR_TASK| Intent.FLAG_ACTIVITY_NEW_TASK 。