Android 基础功 - activity启动模式深入理解分析


俗话说 - 好记性不如烂笔头。互联网时代,只好用博客代替烂笔头了 。



废话少说 ,先抛出一个问题,Android中的 activity为什么要引入启动模式这么个东西呢?


activity 一共有四种启动模式 ,分别是

standard” 
singleTop” 
singleTask” 
singleInstance

其中默认模式是“standard”。

1.standard - 默认的启动模式


standard 是默认的启动模式,也就意味着加入我们不在activity标签中配置 launchMode 属性,那么当前activity就按照standard模式运行。
当我们以 标准模式打开一个activity的时候,不管当前任务栈中是否存在此实例,都会在activity的任务栈中新建一个实例,放到栈顶。并且以标准的activity生命周期方法去运 行它  。


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 模式演示

现在将 midActivity 配置为 singleTop ,通过 main - mid - mid 的启动方式来演示

通过activity生命周期方法的log可以发现,第一次打开 midActivity 的时候,调用了 oncreate 和 onresume 生命周期方法,这时候 midActivity就位于 activity栈顶了,那么我们通过 midActivity自身打开minActivity的时候,返现oncreate和onStart不会被调用了,只会调用 onNewIntent和onResume 方法。

那么我们再次dump 出activity的栈信息来看:



栈内也只有一个 minActivity实例,再次验证了我们的理论。


c> singleTask 模式演示

 MainActivity  - MidActivity - EndActivity - MainActivity  ,其中除了mainactivity是配置为singleTask外,其他的均为标准模式


通过上图,我们可以清楚的看出来,当栈内已经存在了mainActivity实例的时候,mainActivity 的onCreate是不会被调用的,

并且 栈内也只有了一个 mainActivity实例,验证了 singleTask 启动模式自带 clearTop效果的说明。


c> singleInstance 模式演示

MainActivity(singleTask)  - MidActivity(singleInstance) - EndActivity(standard)
  

通过activity堆栈信息我们可以发现,mainActivity 和 EndActivity是运行在统一栈中的,而配置为singleInstance 的MidActivity单独的在一个栈内。当我们点击返回按钮,发现从EndActivity 退回到了 MainActivity


小结 :

通过本文理论和实例分析,我们大致的弄清楚了 activity 四种启动模式的不同效果,那么我们就可以在开发中根据不同的场景,选择不同的launchMode来满足我们的开发需求 了。

理论和实例固然重要,更重要的是学会灵活运用。


参考 :

1.  https://developer.android.com/guide/topics/manifest/activity-element.html#lmode
2.  《Android开发艺术探索》



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值