036android初级篇之Activity的启动模式

task容器任务栈

  1. 当用户点击某个应用程序图标打开一个应用时,那么这个任务就处于前端。如果这个应用程序之前未被打开过,就会创建一个新的任务Task。
  2. Task是一个Activities的收集器,专门收集用户操作交互所打开的Activity。这些Activities都被安排在一个回收栈back stack中,安排的顺序和它们打开的顺序一致。即先打开的安排在最底部,最后一个打开的安排在顶部。

运行模式介绍

你可以通过定义运行模式来定义Activities如何与Task进行交互。定义的两种方式如下:

  1. 使用manifest配置文件
  2. 使用intent的标识

例子:Activity A 启动 Activity B。如果B在manifest中定义了运行模式,并且A在启动B时,也在Intent中指定了B的运行模式,那么A在Intent的定义将覆盖B在manifest中的定义。

注:有些运行模式在manifest中定义有效未必在Intent中也有效,同样,在Intent定义有效的运行模式在manifest中未必生效。

Activity的launchMode属性来指定4中不同的运行模式

Standard:标准默认模式

在这种默认模式下,Activity可以被多次实例化,也可以运行在多个Task中,一个Task可以拥有多个Activity实例。

singleTop

在这种模式下,如果一个Activity实例已经存在于当前Task的最顶部,那么系统将调用onNewIntent()方法路由到这个实例,而不是创建一个新的Activity实例。

一个Activity可以被实例化多次,且可以从属于不同的Task任务,且一个任务中可以存在多个Activity实例(这情况仅仅存在于Activity实例不在Task任务的顶端)。

A-B-C-D:再开启D,back stack中的情形:
在标准模式下,则为 A-B-C-D-D
在singleTop模式,则为A-B-C-D
如果开启B
则在singleTop模式下为 A-B-C-D-B

singTask

这种模式下,系统创建一个新的Task,并在Task的底部实例化Activities。然而,当一个实例存在于一个独立的Task时,系统不是去创建一个新的实例,而是调用onNewIntent()路由到其他任务的实例。在同一时间,只存在一个Activity实例。

singInstance

于singTask相似,唯独一点不同的是,这个实例只能在一个单独的Task中使用。

如何使用Intent配置管理

在启动Activity时,你可以通过传递一个Intent入参给startActivity()方法,来实现与manifest配置类似功能,改变Activity在task中的行为。

  1. FLAG_ACTIVITY_NEW_TASK
    和 singleTask 一样

  2. FLAG_ACTIVITY_SINGLE_TOP
    和singleTop一样

  3. FLAG_ACTIVITY_CLEAR_TOP
    这个模式是没有属性配置支持的。在这种模式下,如果启动一个已经存在于当前Task任务的Activity,那么Task顶部所有的Activity将被销毁,并且为将要启动的Activity新建一个Activity实例,存放在task的back stack的顶部。

  4. FLAG_ACTIVITY_CLEAR_TOP通常与FLAG_ACTIVITY_NEW_TASK一起结合使用,
    结合使用可以达到这样的效果:找到在其他Task中存在的Activity,并将它放置到一个可以相应Intent的地方。如果是standard模式,那么它将从stack移除,并新建一个Activity去相应Intent,因为这种模式下,总是新建Activity。

参考链接

  1. Activity的启动模式
  2. Android 开发指南(一) 任务Task及回收栈back stack介绍

你可能感兴趣的:(036android初级篇之Activity的启动模式)