Activity 启动模式LaunchMode

前沿

  • 为什么需要启动模式
    在Android开发中,我们都知道,在默认的情况下,如果我们启动的是同一个Activity的话,系统会创建多个实例并把它们一一放入任务栈中。当我们点击返回(back)键,这些Activity实例又将从任务栈中一一移除,遵循的原则是“后进先出”(先进后出)。
    这里我们考虑一个问题,当我们多次启动同一个Activity,系统也会创建多个实例放入任务栈中,这样岂不是很耗费内存资源?为了解决这一问题,Android为Actiivty提供了启动模式。

  • 启动模式
    Activity的启动模式有四种:standardsingleTopsingleTasksingleInstance

  • 如何使用

    
       android:launchMode="singleTop" >
    
    

启动模式的分类

标准模式:standard

  • 这种启动模式为标准模式,也是默认模式
  • 每当我们启动一个Activity,系统就会相应的创建一个实例,不管这个实例是否已经存在
  • 这种模式,一个栈中可以有多个实例,每个实例也都有自己的任务栈。而且是谁启动了此Activity,那么这个Activity就运行在启动它的Activity所在的栈中。

栈顶复用模式:singleTop

  • 当前栈中不存在该Activity的实例时:其行为同standard启动模式
  • 当前栈中已有该Activity的实例并且该实例位于栈顶时:不会创建实例,而是复用栈顶的实例,并且会将Intent对象传入,回调onNewInten()方法
  • 当前栈中已有该Activity的实例但是该实例不在栈顶时:其行为和standard启动模式一样,依然会创建一个新的实例

栈内复用模式:singleTask

在复用的时候,首先会根据taskAffinity去找对应的任务栈:

  • 如果不存在指定的任务栈,系统会新建对应的任务栈,并新建Activity实例压入栈中
  • 如果存在指定的任务栈,则会查找该任务栈中是否存在该Activity实例
    a、如果不存在该实例,则会在该任务栈中新建Activity实例
    b、如果存在该实例,则会直接引用,并且回调该实例的onNewIntent()方法。并且任务栈中该实例之上的Activity会被全部销毁

单实例模式:singleInstance

启动该模式Activity的时候,会查找系统中是否存在:

  • 不存在,首先会新建一个任务栈,其次创建该Activity实例
  • 存在,则会直接引用该实例,并且回调onNewIntent()方法

LaunchMode Flag

Activity 的启动模式除了在 AndroidManifest 文件中设置以外,还可以通过 Intent的 Flag 来设置:

  • FLAG_ACTIVITY_NEW_TASK
    使用一个新的任务栈 Task 来启动一个 Activity,但启动的每个Activity都将在一个新的任务栈 Task 中。该 Flag 通常使用在从Service 中启动 Activity 的场景,由于Service中并不存在Activity 任务栈,所以使用该 Flag 来创建一个新的Activity栈,并创建新的 Activity 实例。

  • FLAG_ACTIVITY_SINGLE_TOP
    使用 singletop 模式启动一个Activity, 当这个Activity位于历史stack的顶端运行时,不再创建一个新的Activity实例;

  • FLAG_ACTIVITY_CLEAR_TOP
    销毁目标Activity和它之上的所有Activity,重新创建目标Activity

  • FLAG_ACTIVITY_NO_HISTORY
    一个 Activity 使用这种模式启动后,当该 Activity 启动其他Activity后,该 Activity 自己就消失了,不会保留在Activity栈中。

  • FLAG_ACTIVITY_BROUGHT_TO_FRONT
    在launchMode中设置singleTask模式时系统会设定。

  • FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
    如果设置,新的Activity不会在最近启动的Activity的列表中保存。

  • FLAG_ACTIVITY_FORWARD_RESULT
    如果设置,并且这个Intent用于从一个存在的Activity启动一个新的Activity,那么,这个作为答复目标的Activity将会传到这个新的Activity中。这种方式下,新的Activity可以调用setResult(int),并且这个结果值将发送给那个作为答复目标的 Activity。

  • FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY
    这个标志一般不由应用程序代码设置,如果这个Activity是从历史记录里启动的(常按HOME键),系统会设定。

你可能感兴趣的:(Activity 启动模式LaunchMode)