本文首发在个人我的微信公众号:Android开发圈java
关于Activity的启动模式是面试高频问题,在平时开发中,做用也不小,因此仍是颇有必要搞懂这一块的知识。其实以前也有写过这个主题的文章,可是当时是随便写了一点来记录的。此次准备写的完善点。同时经过gif动态演示各类模式下的入栈出栈状况,加深对四种模式的理解。android
Activity的启动模式是告诉Activity应该以什么样的方式来启动。Activity的启动模式有四种,分别是:面试
其中standard模式是Activity默认启动模式。微信
这里有两种方式来实现设置。学习
在AndroidManifest清单文件中,在注册Activity组件的时候,经过"android:launchMode"标签来设置启动模式。动画
例如:this
<activity android:name=".DemoActivity"
android:launchMode="standard"
>
</activity>
复制代码
这就表示"DemoActivity"的启动模式是standard模式。若是想把DemoActivity的启动模式改为singleTask,那么把"standard"改为"singleTask"便可。spa
咱们一般会用startActivity()方法来跳转至指定的Activity,这里就能够经过给intent设置flag的方式来进行设置启动模式。3d
例如:code
Intent intent = new Intent(this,MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);
复制代码
上面这两种方式虽然均可觉得Activity设置启动模式,可是仍是有区别的,第二种方式不支持singleInstance模式,可是第二种方式的优先级高于第一种方式,当这两种方式同时存在的时候,以第二种方式为准。
在介绍这四种启动模式以前,要先知道任务栈(返回栈)的概念,其是一种先进后出的栈结构,任务就是指Activity,当启动一个新的Activity的时候,会建立这个新的Activity实例,并让其入栈,位于栈顶。当按back返回键的时候,会让当前栈顶Activity出栈。下图展现了启动Activity和返回上一层的入栈,出栈表现。
当屡次启动同一个Activity的时候,会重复建立目标Activity的实例,让其入栈。例如:
设置Activity a的launch mode是standard模式。屡次启动Activity a,其入栈的表现以下:
按返回键出栈的效果以下。
当目标Activity A的启动模式是singleTop时,此刻启动Activity A,若是当前栈的栈顶Activity不是Activity A,那么就会建立A的实例,并入栈。若是当前栈顶已是A,那么再启动Activity A就无需建立A的实例,直接复用栈顶元素便可。此刻A的onNewIntent(Intent intent)方法会触发 ,onCreate,onStart方法不会触发 动画演示以下:
当栈顶元素不是A时:
当栈顶元素是A时:
在启动Activity的过程当中,从Activity的实例化次数来对这四种模式分类,上面两种模式standard、singleTop模式,属于一类,它们是会对Activity实例化屡次;接下来要介绍的singleTask、singleInstance模式属于另外一种,只会对Activity建立一个实例。
说的singleTask模式,就不得不介绍一下taskAffinity属性,这个属性是对Activity对应的task栈命名的,默认状况下,全部Activity所须要的任务栈的名字是应用的包名,换句话说就是全部的Activity都用的同一个任务栈。
在singleTask模式下,启动Activity A,会先检测A对应的任务栈存不存在,不存在的话,就创新所需的任务栈,并完成初始化A,入栈行为。若是A对应的栈存在的话,要检测该栈中是否已有A的实例(A以前是否已经入栈过),若是没有,那就初始化实例,入栈;若是有的话,那就把该元素移至栈顶,该元素以前的元素全都移除出栈。
流程图以下:
Gif 动态演示:
singleInstance模式和singleTask模式有点像,他们都是单实例模式的,即只有一个实例。可是singleInstance比严格点。当启动一个launch mode为singleInstance模式的Activity的时候,系统会为该Activity单首创建一个专属的任务栈,在为其所用。当重复启动该Activity的时候,因为栈中已有该实例,就直接复用就好。singleInstance模式比较简单,好理解,这里就再也不用gif动态图演示了。
总结一下,上面说了Activity的四种启动模式,它们分别是standard模式(默认的)、singleTop模式、singleTask模式、singleInstance模式。
根据是否会被屡次建立,这四种模式能够分为两类。
一类是会被屡次建立,包括standard模式,singleTop模式(目标Activity已位于栈顶,则无需建立)。
另外一类是单实例模式,包括singleTask和singleInstance。
当栈内的Activity被复用的时候,onNewIntent(Intent intent)方法将被触发。
taskAffinity属性能够为Activity对应的栈设置名称,也就是为目标Activity设置对应的任务栈,常和launch mode标签配合使用。
写做不易,若是以为文章内容对你有用的话,就点"赞",鼓励一下吧,让做者更有创做的动力!
扫码加入个人我的微信公众号:Android开发圈 ,一块儿学习Android知识!!
![]()