Android Activity启动模式分析
- standard 标准启动模式
- singleTop 栈顶复用模式
- singleTask 栈内复用模式
- singleInstance 全局单例模式
standard 标准启动模式
该模式也是Android中activity默认的启动模式,每次启动目标activity时,都会创建一个新的实例,添加到当前的Task中,看下图:原有栈中含有A-B-C三个activity,现在由C启动目标B,则看到在栈顶添加了一个新的实例B。
singleTop 栈顶复用模式
在这个模式中又分为三种情况:
1、在当前栈中已经有了某个activity的实例,并且该activity位于栈顶,在这个时候启动此activity不会创建新的实例,而是复用栈顶实例,通过传入Intent对象,回调onNewIntent()方法.看图:当前task中含有A-B-C三个activity,启动ActivityC时,不在创建新的实例,直接复用位于栈顶的ActivityC。
2、在当前栈中已含有某个activity的实例,但是该activity并不是位于栈顶的情况下,启动该activity时,是和standard模式一样的,会创建新的实例。如图:启动原有栈中的B。
3、在当前栈中不含某个activity的实例时,同样和standard模式一样,创建新的activity实例。如图:原有栈中含有A-B-C三个activity,启动ActivityD时,则在当前栈中新建一个实例。
singleTask 栈内复用模式
在该模式下,关系到一个taskAffinity属性。在Manifest中用android:taskAffinity指定该属性值,启动activity时会根据taskAffinity去寻找当前是否存在一个对应名字的任务栈。
1、如果不存在,则会新建一个栈,把新创建的activity实例加入栈中。如图:原有栈中含有A-B-C三个activity,现要从C启动一个ActivityD,而ActivityD声明了android:taskAffinity=”Task1”,会先寻找Task1是否存在,如果不存在,则创建一个新的栈Task1,把ActivityD添加到Task1中。
2、如果存在,如图,原有栈中含有A-B-C三个activity,其中ActivityA定义了android:taskAffinity=”Task”这个属性,当我们要从位于栈顶的C启动A时,这个时候由于Task已经存在,Task中也已经包含了A的实例ActivityA,因此,在这个过程中,位于ActivityA上面的activity会全部出栈,回调onNewIntent()方法启动ActivityA。Task栈中只有一个ActivityA。
注意:上面图的栈中Task是已经含有ActivityA的实例了,假设现在要启动ActivityD,这时候并没有D的实例,所以会在栈顶添加一个D的实例,(即在C的上面添加)如图:
singleInstance 全局单例模式
该模式下启动activity时会开启一个单独的栈存放该activity的实例。栈中要是已存在activity实例,则不会创建新的实例,直接复用,回到onNewIntent()方法,否则会新建一个activity实例。