task容器任务栈
- 当用户点击某个应用程序图标打开一个应用时,那么这个任务就处于前端。如果这个应用程序之前未被打开过,就会创建一个新的任务Task。
- Task是一个Activities的收集器,专门收集用户操作交互所打开的Activity。这些Activities都被安排在一个回收栈back stack中,安排的顺序和它们打开的顺序一致。即先打开的安排在最底部,最后一个打开的安排在顶部。
运行模式介绍
你可以通过定义运行模式来定义Activities如何与Task进行交互。定义的两种方式如下:
- 使用manifest配置文件
- 使用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中的行为。
FLAG_ACTIVITY_NEW_TASK
和 singleTask 一样FLAG_ACTIVITY_SINGLE_TOP
和singleTop一样FLAG_ACTIVITY_CLEAR_TOP
这个模式是没有属性配置支持的。在这种模式下,如果启动一个已经存在于当前Task任务的Activity,那么Task顶部所有的Activity将被销毁,并且为将要启动的Activity新建一个Activity实例,存放在task的back stack的顶部。FLAG_ACTIVITY_CLEAR_TOP通常与FLAG_ACTIVITY_NEW_TASK一起结合使用,
结合使用可以达到这样的效果:找到在其他Task中存在的Activity,并将它放置到一个可以相应Intent的地方。如果是standard模式,那么它将从stack移除,并新建一个Activity去相应Intent,因为这种模式下,总是新建Activity。
参考链接
- Activity的启动模式
- Android 开发指南(一) 任务Task及回收栈back stack介绍