简介
Activity 作为活动窗口是用户与 Android 手机交互的主要载体,作为开发者,我们应当管理和利用好每一个 Activity。
Android 使用 ‘先进后出 (FILO)’ 的任务栈模式去管理这些Acitivity,了解熟悉 Acticity 的启动模式,可以帮助我们自由的控制这个任务栈的进出关系.
Android 中 Activity的启动模式分为四种,分别是:
- Standard
(标准模式)
- SingleTop
(栈顶复用模式)
- SingleTask
(栈内复用模式)
- SingleInstance
(单例模式)
设置
我们在 AndroidManifest.xml 中设置 Activity 启动模式:
<activity android:name=".MainActivity"
android:launchMode="singleTop"
android:theme="@style/AppTheme"/>
具体介绍
Activity的四种启动模式:
Standard
如果你没在 AndroidManifest.xml 中 给 Activity 设置 android:launchMode,那么默认为 Standard.
Standard 模式下,每次 startctivity 时都会创建新的 activity 实例,并放入同一个栈中,当前 Activity finish() 后,他会将栈顶(当前Activity)移除栈,我们会回到上一个Actvity.
举个例子,当前应用只有一个 MainActivity, 他会 startActivity(new Intent(MainActivity.this, MainActivity.class)) 多次,并且按返回键多次,我们来看下他的任务栈变化.
第一次打开只有一个 MainActivity, 在 Standard 下多次 start MainActivity,则会添加多个实例。
SingleTop
当我们startActivity 时,当任务栈的栈顶正好是将要启动的 Activity 时,不会重新创建新的,而是会复用当前实例,当前 Activity 的
onCreate() 不会走,而是会去调用 onNewIntent(), 告诉开发者有新的 Intent 携带数据进来。
如果当前任务栈的栈顶不是将要启动的 Activity, 那么效果会和 Standard 一样重新创建实例放入栈顶。
举例1:A 和 B 二个 Activity, A是 Standard, B是 SingleTop, 打开默认是 A, 跳转 B, 再跳转 B, 效果就是
(栈底部)A B B(栈顶部); --> 第二个 B 不会创建, 而是选择复用栈顶的那个
举例2:A 和 B 二个 Activity ,A是 Standard, B是 SingleTop, 打开默认是 A, 跳转 B, 再跳转 A, 再跳转至 B
(栈底部)A - B - A - B(栈顶部); --> 不再栈顶启动, 会重新创建
SingleTask
调用 startActivty() 时, 如果当前栈中已经有将要启动的 Activity 实例, 不管 Activity 处于什么位置, 不会重新创建, 而是重用该实例, 并且
将清空处于该 Acitivity 栈位置之上的所有 Activity 实例.
如果栈中不存在该实例,将会创建新的实例放入栈中。
A 和 B 二个 Activity, A是 SingleTask, B是 Standard, 打开默认是 A, 跳转 B, 再跳转至 A, 效果就是
(栈底部)A B A (栈顶部); --> 只剩下当初那个 A
SingleInstance
(这是一种单例模式)
如果将要启动的 Acitivyt 实例已经存在, 则找到实例所属于的栈, 继续使用, 不会创建实例, 否则会创建一个新的栈, 单独管理这个 Acitivity 实例
举例:A 和 B 二个 Activity, A是 Standard, B是 singleInstance, 打开默认是A, 然后跳转B, 再跳转A, 在跳转B
A A
B B
存在2个栈,其中 B 单独使用一个栈,而且B, 只存在一个实例