🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
### 1.2 Activity的启动模式 在默认情况下,当我们多次启动同一个Activity 的时候,系统会创建多个实例并把官们一一放入任务栈中, 当我们单击back 键,会发现这些Activity 会一一回退。任务栈是一种“后进先出”的栈结构,这个比较好理解,每按一下back 键就会有一个Activity 出栈,直到栈空为止,当栈中无任何Activity的时候,系统就会回收这个任务栈。 目前有四种启动模式: standard 、singleTop 、singleTask 和singlelnstance 关于任务栈的详细描述,可参考这里[Android中关于任务栈的总结](https://www.kancloud.cn/alex_wsc/android/433739) #### 1.2.1 Activity的LaunchMode 1. standard:标准模式 每次启动都会重新创建一个实例,不管这个Activity在栈中是否已经存在。谁启动了这个Activity,那么Activity就运行在启动它的那个Activity所在的栈中。 用Application去启动Activity时会报错,原因是非Activity类型的Context没有任务栈。解决办法是为待启动Activity制定FLAG_ACTIVITY_NEW_TASH标志位,这样就会为它创建一个新的任务栈。 2. singleTop:栈顶复用模式 如果新Activity位于任务栈的栈顶,那么此Activity不会被重新创建,同时回调 onNewIntent 方法。onCreate和onStart方法不会被执行。 如果新的Activity实例已经存在,但是不位于栈顶,则新Activity仍然会被重新创建。 3. singleTask:栈内复用模式 这是一种单实例模式。只要activity在一个栈中存在,则多次启动此Activity都不会重新创建实例;具体而言,当一个具有singleTask模式的Activity请求启动后,比如Activity A,系统会首先寻找是否存在A想要的任务栈,如果不存在activity所需要的任务栈,则创建一个新任务栈和新Activity实例;如果存在所需要的任务栈,不存在实例,则新创建一个Activity实例,并把它压入栈中;如果存在所需要的任务栈和实例,则不创建,调用onNewIntent方法,同时使该Activity实例之上的所有Activity出栈。 4. singleIntance 单实例模式。具有singleTask模式的所有特性,同时具有此模式的Activity只能独自位于一个任务栈中。换句话说,比如Activity A 是singlelnstance 模式, 当A 启动后,系统会为它创 建一个新的任务栈,然后A 独自在这个新的任务栈中,由于栈内复用的特性,后续的请求 均不会创建新的Activity,除非这个独特的任务钱被系统销毁了。 **什么是Activity 所需要的任务栈呢?** 在singleTask 启动模式中,多次提到某个Activity所需的任务栈,什么是Activity 所需要的任务栈呢?这要从一个参数说起: TaskAffInity,可以翻译为任务相关性。这个参数标识了一个Activity所需要的任务栈的名字,默认情况下,所有Activity所需的任务栈的名字为应用的包名。当然,我们可以为每个Activity 都单独指定TaskAffinity属性,这个属性值必须不能和包名相同,否则就相当于没有指定。TaskAffinity 属性主要和singleTask 启动模式或者allowTaskReparenting 属性配对使用,在其他情况下没有意义。另外,任务栈分为前台任务栈和后台任务栈,后台任务栈中的Activity位于暂停状态,用户可以通过切换将后台任务栈再次调到前台。 **设置启动模式** 1. manifest中 设置下的 android:launchMode 属性。 2. 启动Activity的 `intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);` 。 两种同时存在时,第二种的优先级高于第一种,以第二种为准。其次,在限定范围上有所不同,第一种方式无法直接为Activity添加FLAG_ACTIVITY_CLEAR_TOP标识,第二种方式无法指定singleInstance模式。 可以通过命令行 adb shell dumpsys activity 命令查看栈中的Activity信息。 #### 1.2.2 Activity的Flags 这些FLAG可以设定启动模式、可以影响Activity的运行状态。 * FLAG_ACTIVITY_NEW_TASK 为Activity指定“singleTask”启动模式。 * FLAG_ACTIVITY_SINGLE_TOP 为Activity指定“singleTop"启动模式。 * FLAG_ACTIVITY_CLEAR_TOP 具有此标记位的Activity启动时,同一个任务栈中位于它上面的Activity都要出栈,一般和FLAG_ACTIVITY_NEW_TASK配合使用。 * FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS 如果设置,新的Activity不会在最近启动的Activity的列表(就是安卓手机里显示最近打开的Activity那个系统级的UI)中保存。等同于在xml中指定android:exludeFromRecents="true"属性。 >[info] 注意:Flags并不能简单地等同于启动模式