Android Activity启动模式分析

Android Activity启动模式分析

  • standard 标准启动模式
  • singleTop 栈顶复用模式
  • singleTask 栈内复用模式
  • singleInstance 全局单例模式

standard 标准启动模式

该模式也是Android中activity默认的启动模式,每次启动目标activity时,都会创建一个新的实例,添加到当前的Task中,看下图:原有栈中含有A-B-C三个activity,现在由C启动目标B,则看到在栈顶添加了一个新的实例B。
Android Activity启动模式分析_第1张图片

singleTop 栈顶复用模式

在这个模式中又分为三种情况:

1、在当前栈中已经有了某个activity的实例,并且该activity位于栈顶,在这个时候启动此activity不会创建新的实例,而是复用栈顶实例,通过传入Intent对象,回调onNewIntent()方法.看图:当前task中含有A-B-C三个activity,启动ActivityC时,不在创建新的实例,直接复用位于栈顶的ActivityC。
Android Activity启动模式分析_第2张图片

2、在当前栈中已含有某个activity的实例,但是该activity并不是位于栈顶的情况下,启动该activity时,是和standard模式一样的,会创建新的实例。如图:启动原有栈中的B。
Android Activity启动模式分析_第3张图片

3、在当前栈中不含某个activity的实例时,同样和standard模式一样,创建新的activity实例。如图:原有栈中含有A-B-C三个activity,启动ActivityD时,则在当前栈中新建一个实例。
Android Activity启动模式分析_第4张图片

singleTask 栈内复用模式

在该模式下,关系到一个taskAffinity属性。在Manifest中用android:taskAffinity指定该属性值,启动activity时会根据taskAffinity去寻找当前是否存在一个对应名字的任务栈

1、如果不存在,则会新建一个栈,把新创建的activity实例加入栈中。如图:原有栈中含有A-B-C三个activity,现要从C启动一个ActivityD,而ActivityD声明了android:taskAffinity=”Task1”,会先寻找Task1是否存在,如果不存在,则创建一个新的栈Task1,把ActivityD添加到Task1中。
Android Activity启动模式分析_第5张图片

2、如果存在,如图,原有栈中含有A-B-C三个activity,其中ActivityA定义了android:taskAffinity=”Task”这个属性,当我们要从位于栈顶的C启动A时,这个时候由于Task已经存在,Task中也已经包含了A的实例ActivityA,因此,在这个过程中,位于ActivityA上面的activity会全部出栈,回调onNewIntent()方法启动ActivityA。Task栈中只有一个ActivityA。
Android Activity启动模式分析_第6张图片
注意:上面图的栈中Task是已经含有ActivityA的实例了,假设现在要启动ActivityD,这时候并没有D的实例,所以会在栈顶添加一个D的实例,(即在C的上面添加)如图:
Android Activity启动模式分析_第7张图片

singleInstance 全局单例模式

该模式下启动activity时会开启一个单独的栈存放该activity的实例。栈中要是已存在activity实例,则不会创建新的实例,直接复用,回到onNewIntent()方法,否则会新建一个activity实例。

你可能感兴趣的:(android点滴)