首先介绍一下intent.setFlags方法:设置特殊的flags来控制intent的处理事件。就理解成给intent附加一个标志吧。
intent.setFlags有一些重要的参数,这些参数的含义需要弄清楚。在理解这些参数的含义前,必须先了解Activity的生命周期,和多个Activity的栈管理方式。
多个Activity的栈管理方式
多个 Activity 之间采用的是栈道管理方式, 当用户启动新的 Activity 时, 新启动的 Activity 位于栈顶,当用户按后退按钮时, 栈顶的 Activity 被推出栈道并销毁, 如下图所示
setFlags的参数含义
FLAG_ACTIVITY_NEW_TASK
设置此状态,记住以下原则,首先会查找是否存在和被启动的Activity具有相同的亲和性的任务栈(即taskAffinity,注意同一个应用程序中的activity的亲和性一样,所以下面的a情况会在同一个栈中),如果有,刚直接把这个栈整体移动到前台,并保持栈中的状态不变,即栈中的activity顺序不变,如果没有,则新建一个栈来存放被启动的activity。FLAG_ACTIVITY_CLEAR_TOP
Activity A启动开僻Task堆栈(堆栈状态: A), 在Activity A中启动Activity B(堆栈状态: AB), 在Activity B中启动Activity C(堆栈状态: ABC), 在Activity C中启动Activity D(堆栈状态: ABCD), 在Activity D中启动Activity B, 启动Activity B的Intent的Flag设置为FLAG_ACTIVITY_CLEAR_TOP, (堆栈状态: AB)。- FLAG_ACTIVITY_SINGLE_TOP
当前Task堆栈中存在ABCD四个Activity, A是栈顶Activity, D为栈底Activity, 存在打开A的Intent中设置FLAG_ACTIVITY_SINGLE_TOP标志, 则会使用栈顶A, 而不会从新New A.
注意如果在应用外启动应用内的activity,则要设置newtask哦。
launchMode介绍
launchMode的作用与setFlags类似,但是其实在Manifest.xml里面配置的,所以,一旦配置了某launchMode,则这个Activity的所有实例都会有该属性。
- standard
如果启动此Activity的Intent中没有设置FLAG_ACTIVITY_NEW_TASK标志, 则这个Activity与启动他的Activity在同一个Task中,”launchMode”设置为”standard”的 Activity可以被实例化多次, 可以在Task中的任何位置, 对于一个新的Intent请求就会实例化一次。 - singleTop
如果启动此Activity的Intent中没有设置FLAG_ACTIVITY_NEW_TASK标志, 则这个Activity与启动他的Activity在同一个Task中,”launchMode”设置为”singleTop”的Activity可以被实例化多次, 可以在Task中的任何位置, 对于一个新的Intent请求如果在Task栈顶, 则会用栈顶的Activity响影Intent请求,而不会重新实例化对象接收请求, 如果没有在栈顶, 则会实例化一个新的对象接收Intent请求。 - singleTask
“launchMode”设置为”singleTask”的Activity总是在栈底, 只能被实例化一次, 它允许其它Activity压入”singleTask”的Activity所在的Task栈,如果有新的Intent请求有此标志的Activity, 则系统会清除有此标志的Task栈中的全部Activity,并把此Activity显示出来。 - singleInstance
launchMode”设置为”singleInstance”的Activity总是在栈底, 只能被实例化一次, 不允许其它的Activity压入”singleInstance”的Activity所在Task栈, 即整个Task栈中只能有这么一个Activity。