前言:
做Android开发已经有三四个年头,因为自己比较懒的缘故很少写这类文档,总觉得有自己超强的的无敌大脑就能记录下所有的技术要点,几天前因为公司有个小朋友要离职,我要面试新员工的技术问题,我准备的第一个面试问题便是Android的四种启动模式,自己在面试前想了下每种模式下不同的压堆栈,竟然有些模糊了,于是我就去晚上看看,有没有写的比较好的启动模式,浏览了半天也没有特别理想的,不是介绍不够全面,就是有错误的地方(有点误人子弟,希望分享文档的小伙版能认真对待,不然能把小白们害惨了),最近公司事情比较少,抽空写下文档,本篇带给大家的是Android的四种启动模式。
说到Android的启动模式,我们都知道Android有四种启动的模式,分别是:standard,singleTop,singleTask,singleInstance,让后我们会想到的是 在AndroidManifest.xml配置文件中配置Activity的launchMode属性,但是即便你真的配置了,singleTask这样的属性,它真的会和其他启动结果不一样吗?我这里很遗憾的告诉你答案是否定的。可能细心的小伙伴已经发现,在使用launchMode的时候需要配合taskAffinity有时候使用才有效果。这里你不必担心为什么会有这样的事情,因为下面我将会告诉你原因。你们是不是觉得说到这里就可以进入正题一展Android的启动模式的风采,那很遗憾的告诉你,你又打错了,哈哈。有些小伙伴可能又猜到了,如果启动模式只能在AndroidManifest.xml配置那不是太low了吗?其实Google的也给我们封装了,在Java代码中配置启动模式的方式,有时候我们需要两种方式配合使用才能达到我们想要的效果。
测试前提条件:我们定义如下类如图:
BaseActivity 中打印了关键的生命周期的日志信息。代码已上传到github上,有兴趣的小伙伴可以自行下载测试。
1.standard-默认模式。
在开发中我们经常用到的就是这种启动方式,大部分时候我们在AndroidManifest.xml中配置一个Activity的时候并不需要设置launchMode属性,如果我们不去设置的话Android系统就会模式为standard启动模式。系统默认使用该模式,每次启动Activity的时候都会创建新的实例。
场景1:我们先将A,B,C,D用标准模式启动依次压栈,然后再用标准模式启动D。我们先用adb shell dumpsys activity activities 命令打印出Acitivity的堆栈信息,打印结果如下图:
根据堆栈信息我们很明显的看到有两个D被压入栈。根据前面的hashCode的不同我们可以判断出这两个D是不同的Activity.
有些同学可能觉得打印堆栈的方式不是很容易理解,那我们再来看下Activity的生命周期方法。
如图
这里我只打印了,onCreate 生命周期方法,小伙伴们都应该知道只有创建新的Activity的时候才会调用这个方法吧,我们可以看到堆栈中先调用了,A的onCreate方法,后面依次是B,C,D,D的onCreate方法,我们主要关注最后一次的D的onCreate的调用,这说明了什么,毫无疑问我们在原来的栈顶D上又新创建了一个D。由此可见standard启动模式是不管当前栈中的压栈是什么样子,都会创建新的Activity,然后压栈。到此标准的启动模式已经讲解完了,不知道小伙伴们还有什么地方不清楚的,欢迎在下面留言。
singleTop- 栈顶复用模式