前言

记录本人对Activity启动模式的新理解

1.指定启动模式的两种方式

方式一:在Menifest文件中指定​​launchMode​​​属性
方式二:启动Activity的时候,指定​​​Flags​​(这种方式优先级更高)

2.启动的Bug示例

当一个非Activity类型的Context去启动Activity的时候就会报错。这是因为非Activity类型的Context(如ApplicationContext)并没有所谓的任务栈。
比如ActivityA要启动ActivityB,以standard模式启动。那么B肯定要进入A所在的任务栈,但是如果是ApplicationContext启动的ActivityB,ApplicationContext都没有任务栈,所以会报错。

3.什么是任务栈

说的比较抽象,其实可以理解为一个参数:​​taskAffinity​​​。在​​manifest​​文件中设置即可。这个参数标识了一个Activity所需要的任务栈名字。默认情况下所有Activity所需的任务栈的名字都为应用的包名。

任务栈分为前台任务栈和后台任务栈,后台任务栈中的Activity处于暂停状态,用户可以通过切换将后台任务栈再次调到前台。

4.Activity启动常用的Flags

①​​FLAG_ACTIVITY_NEW_TASK​​​:相当于singleTask启动模式
②​​​FLAG_ACTIVITY_SINGLE_TOP​​​:相当于singleTop启动模式
③​​​FLAG_ACTIVITY_CLEAR_TOP​​:我个人觉得效果和singleTask启动模式一样

5.一个例子,把启动模式理解透

有几个Activity,分别是A,B,C,其中A是standard启动模式,​​taskAffinity​​​默认的为包名。而B和C是singleTask启动模式,​​taskAffinity​​​为​​"com.ljh.newtask"​​。那么请问:在A中启动B,B中启动C,C中启动A,A中又启动B。然后连续按两次返回键,最后的页面是什么?

分析:A启动B,会为B创建一个新的任务栈即​​"com.ljh.newtask"​​​任务栈,并把B放入栈中。然后B启动C,会发现C所需要的任务栈已经创建好了,就直接创建C然后入栈就好了。C启动A,因为A是standard,所以直接创建A,并加入C所在的任务栈,此时任务栈里面是​​B-C-A​​,B位于栈底。然后再启动B,因为B是singleTask,所以会栈内复用,将C和A移出栈,此时栈中就只有B了。这时候按第一次返回键,B出栈,B所在的任务栈也不存在了。此时只能回到后台任务栈然后把A显示出来。然后继续按第二次返回键,A也出栈。然后就回到桌面了。