Activity四种启动模式及相关Flag

Activity有四种启动模式

  • standard
  • singleTop
  • singleTask
  • singleInstance

standard
默认模式,每次启动创建一个Activity,所属启动栈跟启动它的Activity一样。

singleTop
如果新的activity已经位于栈顶,这个时候新建Activity会复用这个Activity而不是新建Activity。此时onCreate(),onStart()不会调用,onNewIntent方法会被调用。
其他情况下,和standard模式相同。
singleTask
启动Activity时,会去寻找当前是否存在一个和taskAffinity名(默认是包名,可以通过Activity的android:taskAffinity属性指定)一样的任务栈。

  • 如果不存在,则会创建一个新的Task,并创建新的Activity实例入栈到新创建的Task中去。
    如果存在,则得到该任务栈,查找该任务栈中是否存在该Activity的实例:
    • 如果存在实例,则将它上面的Activity实例都出栈,然后回调启动的Activity实例的onNewIntent方法。
    • 如果不存在该实例,则新建Activity,并入栈。

利用singleTask的这个特性,我们可以将两个不同App中的Activity设置为相同的taskAffinity,这样虽然在不同的应用中,但是Activity会被分配到同一个Task中去。
singleInstance
此模式是在singleTask的基础上,再增加全局唯一性这个特性。
以singleInstance模式启动的Activity在整个安卓系统中是单例的,独占自己的一个任务栈。启动时如果已经存在实例(不管此实例是自己应用启动的,还是其他应用启动的),就复用实例,并回调onNewIntent方法 。

其他常用的影响启动模式的Flag

如果同时设置了android:launchMode=""属性和intent的flag属性,后者的优先级更高。
有跟四大启动模式对应的Flag,但这个对应关系有点复杂,一般情况下用属性设置就可以。
其他的常用Flag还有:

  • Intent.FLAG_ACTIVITY_NEW_TASK
    该 Flag 通常用于从 Service 启动 Activity 的场景,由于在 Service 中并不存在 Activity 栈,所以使用该 Flag 来创建一个新的 Activity 栈。
    如果找到一个task的taskAffinity与之相同,就将目标Activity压入此task中,如果查找无果,则创建一个新的task,并将该task的taskAffinity设置为目标Activity的taskActivity,将目标Activity放置于此task。
  • Intent.FLAG_ACTIVITY_NO_HISTORY
    使用这种模式启动 Activity,当该 Activity 启动其他 Activity 后,该 Activity就消失了,不会保留在栈中。
  • Intent.FLAG_ACTIVITY_REORDER_TO_FRONT
    如果已经启动了四个Activity:A,B,C,D
    在D Activity里设置此Flag启动一个 Activity B,结果是A,C,D,B。
  • FLAG_ACTIVITY_CLEAR_TASK
    如果在调用Context.startActivity时传递这个标记,将会导致任何用来放置该activity的已经存在的task里面的已经存在的activity先清空,然后该activity再在该task中启动,也就是说,这个新启动的activity变为了这个空tas的根activity.所有老的activity都结束掉。该标志必须和FLAG_ACTIVITY_NEW_TASK一起使用。
    如果已经启动了四个同一task的Activity:A,B,C,D
    以 FLAG_ACTIVITY_NEW_TASK|FLAG_ACTIVITY_CLEAR_TASK 为Flag启动ActivityB后:
    结果是只剩ActivityB,并且是新的ActivityB

注:
startActivityForResult时,Flag的设置无效

参考文章:
android开发中如何结束所有的activity
基础总结篇之三:Activity的task相关
彻底弄懂Activity四大启动模式
Activity 启动模式分析

应用场景

  • 重启APP
Context.startActivity(intentFor().newTask().clearTask())
Runtime.getRuntime().exit(1)

你可能感兴趣的:(Activity四种启动模式及相关Flag)