俗话说 - 好记性不如烂笔头。互联网时代,只好用博客代替烂笔头了 。
废话少说 ,先抛出一个问题,Android中的 activity为什么要引入启动模式这么个东西呢?
activity 一共有四种启动模式 ,分别是
“standard
”
“singleTop
”
“singleTask
”
“singleInstance
”
其中默认模式是“standard
”。
1.standard - 默认的启动模式
2.singleTop 栈顶复用模式
如果此activity实例位于栈顶,那么就不会再次创建实例,而是会调用他的onNewIntent方法去复用此实例。并且被复用的activity 他的 生命周期方法会收到影响,onCreate ,onStart 。。 生命周期方法不会被调用。
3. singleTask启动模式
singleTask 启动的activity 是一种栈内复用的方式,假如activity栈内存在 此实例,那么和singleTop一样不会重新创建实例,而是会复用位于栈内的实例。并且调用他的onNewIntent方法。当栈内存在了此activity实例的时候,那么位于此实例上的其他activity实例都会被出栈,也就是说 singleTask配置的activity自带 clearTop效果。
4.singleInstance 启动模式
被singleInstance配置的activity,会被单独的放入一个新的activity栈中,他具有singleTask的所有效果 并且 被 singleInstance 启动的activity,实例会放入前一个activity栈中。
比如 通过 A --> B(singleInstance)- - > C 那么 实例A和C 位于同一栈内 。
说了这么多,都是一些枯燥乏味的理论知识,但是理论呢,使我们对activity启动模式认知的基础,下面我们就拿出来几种案例来具体的说明activity启动模式以及不同模式在任务栈中的具体效果。
那么我们koi用三个 Activity 分别为 mainActivity(默认配置为singleTask) ,MidActivity ,EndActivity 来具体模拟。
5.activity启动模式实战
a> 标准模式启动演示
我们的启动流程为 main - mid - end ,其中 mid和end两个activity都是默认的standard 配置 ,下面通过 dump activity信息我们可以观察到
通过观察红框中的内容,我们可以发现,编号为85的task中包括了#5,#6,#7 三个activity对象,其中也就验证了上面理论的正确性,每次都会添加到当前任务栈顶部。
b> singleTop 模式演示
那么我们再次dump 出activity的栈信息来看:
栈内也只有一个 minActivity实例,再次验证了我们的理论。
c> singleTask 模式演示
通过上图,我们可以清楚的看出来,当栈内已经存在了mainActivity实例的时候,mainActivity 的onCreate是不会被调用的,
并且 栈内也只有了一个 mainActivity实例,验证了 singleTask 启动模式自带 clearTop效果的说明。
c> singleInstance 模式演示
通过activity堆栈信息我们可以发现,mainActivity 和 EndActivity是运行在统一栈中的,而配置为singleInstance 的MidActivity单独的在一个栈内。当我们点击返回按钮,发现从EndActivity 退回到了 MainActivity
小结 :
通过本文理论和实例分析,我们大致的弄清楚了 activity 四种启动模式的不同效果,那么我们就可以在开发中根据不同的场景,选择不同的launchMode来满足我们的开发需求 了。
理论和实例固然重要,更重要的是学会灵活运用。
参考 :