1 Activity的四种加载模式

配置Activity时指定 android:launchMode 属性配置加载模式。

支持的属性值:

  • standard(标准模式,默认的加载模式): 不会启动创建新的任务栈,新的Activity会被添加到启动该Activity所在的原有的Task中
  • singleTask(Task内单例模式):
  • 创建的Activity所需要的Task不存在:创建该Activity所需要的Task,并将Activity添加到该Task中
  • 创建的Activity所需要的Task存在:
  • 将要启动的目标Activity不存在,系统会创建目标Activity实例,并将它加入Task栈顶
  • 将要启动的目标Activity位于Task栈顶,系统不会重新创建目标Activity实例,直接复用已有的Activity实例(会调用 onNewIntent() 获取当前请求信息)
  • 将要启动的目标Activity已经存在,但没有位于Task栈顶,系统会将所有位于该Activity上面的Activity移出Task栈,使目标Activity位于Task栈顶(会调用 onNewIntent() 方法获取当前请求信息)
  • singleTop(Task栈顶单例模式):
  • 将要启动的目标Activity已经位于Task栈顶时,系统不会重新创建目标Activity实例,而是直接复用已有的Activity实例(会调用 onNewIntent() 获取当前请求信息)
  • 将要启动的目标Activity没有位于Task栈顶,会重新创建目标Activity实例加载到Task栈顶
  • singleInstance(全局单例模式): 该模式具有 singleTask 的所有特性,无论从哪个Task中启动目标Activity,只会创建一个目标Activity实例,并会使用一个全新的Task来加载该Activity实例。(简单说:Activity总是位于Task栈顶,且Activity所在的Task只包含该Activity)
  • 将要启动的目标Activity不存在,系统会先创建一个全新的Task,再创建目标Activity实例,并将它加入新的Task栈顶
  • 将要启动的目标Activity已经存在,无论它位于哪个应用程序中、位于哪个Task中,系统都会把该Activity所在的Task转到前台,从而使该Activity显示出来。(即该Activity使用了该模式,调用启动该Activity都会使用这个已经单独创建了Task的Activity,除非Task被销毁才会被重新创建)

2 Activity的Flags

  • FLAG_ACTIVITY_NEW_TASK:这个标记位的作用是为Activity指定singleTask启动模式
  • FLAG_ACTIVITY_SINGLE_TOP:这个标记位的作用是为Activity指定singleTop启动模式
  • FLAG_ACTIVITY_CLEAR_TOP:具有此标记位的Activity,当它启动时,在同一个任务栈中所有位于它上面的Activity都要出栈。这个模式一般需要和 FLAG_ACTIVITY_NEW_TASK 配合使用。在这种情况下,被启动Activity的实例如果已经存在,那么系统就会调用它的 onNewIntent()。如果被启动的Activity采用standard模式启动,那么它连同它之上的Activity都要出栈,系统会创建新的Activity实例并放入栈顶
  • FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:具有这个标记位的Activity不会出现在历史Activity列表中,当某些情况下我们不希望用户通过历史列表回到我们的Activity时这个标记位比较有用。它等同于在xml中指定Activity的属性 android:excludeFromRecents="true"