前言
记录本人对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也出栈。然后就回到桌面了。