1. Task 和 BackStack
在学习launchMode之前,我们先要理解Task和BackStack,Task是用户所交互的activity的序列,通常情况下,一个Task是从用户点击app图标首次运行一个app开始的,在不返回Home界面的情况下,后续所跳转的所有Activity都属于该Task。
一个Task中的所有Activity都是放在一个栈中去管理的,这个栈就是BackStack,每一个Task都有一个BackStack。在简单的场景下,用户每打开一个新的Activity,这个Activity就会被Push到BackStack顶部,用户按Back键退出一个Acticity时,这个Activity会被Pop出BackStack并Destroy。
Task的状态也分为前台和后台(Background),当我们按Home键时,整个Task都会被切换到后台,当Task处于后台时,Task中所有Activity都处于stopped状态。
盗一张developers的图:
2.launchMode
launchMode用来定义Activity加载进Task的方式,它有以下四种:
(1)standard
如果不声明的话默认使用的就是这种方式,当你使用Intent启动一个Activity时,系统每次都会创建一个新的实例,并将该实例放入当前的BackStack中。在这种模式下,一个Activity可以被实例化多次,一个Task中可以有该Activity的多个实例,多个实例也可能在不同的Task中。
(2)singleTop
在这种模式下,如果某个Activity的实例处于BackStack顶部,那么当有Intent启动该Activity时,系统将会使用顶部的该Activity实例而不会创建新的实例。如果某个Activity的实例并不处于栈顶的话,系统将会创建新的实例,和standard一样。
(3)singleTask
在该模式下,一个Activity只存在于一个Task中,当有Intent启动该Activity时,如果该Activity从未创建,系统将会为该Activity创建一个新的Task,并将该Task的BackStack Push到调用该Activity的Task的栈顶,看google的一张图可以清晰的理解该方式:
从上图可以看出,一个Task是可以有多个Activity的。
(4)singleInstance
该模式与singleTask的唯一区别就是,一个Task中只存在一个Avtivity,换句话说,只要一个Activity不存在,系统创建它时都会为它创建一个Task。