Activity的启动模式

1、概述

Android提供了四种启动模式,分别是:android

标准模式(Standard)bash

栈顶复用模式(SingleTop)数据结构

栈内复用模式(SingleTask)函数

单例模式(SingleInstance)this

下面依次介绍每种模式的特色,首先了解什么是task,task翻译过来就是“任务”,是一组相互有关联的Activity集合,能够理解为Activity是在task里面活动的。task存在于一个称为back stack的数据结构中,也就是说,task是以 栈的形式去管理Activity的,因此也叫能够称为“任务栈”。综上所述:“任务栈”是Activity的管理方式,采用的是“后进先出”的栈结构,每按一次Back键,就会有一个Activity出栈spa

2、四种启动模式具体特色

(一)Standard

标准模式,也是系统默认的启动模式,该模式特色:翻译

  1. 每启动一次Activity,都会建立一个新的Activity实例在栈顶,无论这个实例在任务栈中是否已经存在。假如 Activity A启动了 Activity B,Activity B则会运行在Activity A所在的任务栈中并处于栈顶位置。code

  2. 非Activity类型的context(如ApplicationContext)启动standard模式的Activity时会报错。由于非Activity类型 context 并无任务栈,故没法采用标准模式启动Activity。解决办法能够为待启动Activity指定 FLAG_ACTIVITY_NEW_TASK标记位,这样启动的时候系统就会为它建立一个新的任务栈。实际上待启动Activity是采用singleTask模式启动的。cdn

(二)SingleTop

栈顶复用模式,该模式特色:xml

  1. 若须要新建的Activity位于任务栈栈顶,那么此Activity的实例就不会从新建立,而是复用栈顶的实例。调用Activity的onNewIntent()方法不会调用onCreate()和onStart()方法。

  2. 假如Activity A启动Activity B,就会判断A所在的任务栈栈顶是不是B的实例。若是是,则不建立新的Activity B 实例而是直接引用栈顶实例,同时onNewIntent()方法会被回调,经过该方法的参数能够取得当前请求的信息;若是不是,则建立新的Activity B实例。

(三)SingleTask

栈内复用模式,该模式特色:

. 查看Activity想要的任务栈是否存在(经过查找Activity的taskAffinity属性值相匹配的任务栈是否存在),若不存在,则新建一个任务栈并建立该Activity实例压入栈中;若存在,则查看Activity是否在该栈中,若在,则将该Activity实例之上的全部Activity实例出栈,使该Activity实例置于栈顶,执行回调函数onNewIntent()方法。若不在,则建立该Activity实例并压入栈中。

  1. taskAffinity是在Androidmanifest文件中的一个重要属性,这个参数标识了一个Activity所须要的任务栈的名字。默认状况下,全部Activity所需的任务栈的名字为应用的包名。taskAffinity属性主要和singleTask启动模式或者allowTaskReparenting属性配对使用。

(四)SingleInstance

单实例模式,该模式特色:

  1. 这个是singleTas模式的增强版,它除了具备singleTask模式的全部特性外,它还有一点独特的特性,那就是此模式的Activity只能单独地位于一个任务栈,不与其 Activity共存于同一个任务栈。

  2. 直接建立一个新的任务栈并建立该Activity实例压入栈中。

3、启动模式的设置

两种方法能给Activity指定启动模式:

  1. 在AndroidMainifest设置LaunchMode
  2. 经过Intent设置标志位Intent Flag

(一)在AndroidMainifest设置LaunchMode

<activity 
    android:name=".MainActivity"
    android:launchMode="singleTask">
</activity>
复制代码

(二)经过Intent设置标志位Intent Flag

Intent intent = new Intent(MainActivity.this, LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
复制代码

经常使用Activity的标志位Flags有:

标 志 位 做 用
FLAG_ACTIVITY_SINGLE_TOP 指定启动模式为栈顶复用模式(SingleTop)
FLAG_ACTIVITY_CLEAR_TOP 在同一个任务栈中,全部位于它上面的Activity都要出栈。在下面详细介绍下
FLAG_ACTIVITY_NEW_TASK 指定启动模式为栈内复用模式(SingleTask)
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS 具备这个标记的Activity不会出如今历史Activity的列表中,即没法经过历史列表回到该Activity中,它等同于在XML中指定Activity 的属性 android:excludeFromRecents="true"

FLAG_ACTIVITY_CLEAR_TOP

若是该Activity已经在存在任务栈中,系统会将同一个任务栈中,该Activity之上的全部Activity都出栈,而后将Intent发给这个已存在的Activity,该Activity收到Intent以后,执行回调onNewIntent()方法或者自行结束而后从新建立本身。

  1. 若是该Activity在AndroidMainifest.xml里将启动模式设置成默认standard模式

  1. 若是该Activity在AndroidMainifest.xml里将启动模式设置成默认singleTop模式

  1. 若是该Activity在AndroidMainifest.xml里将启动模式设置成默认singleTask模式

(三)两者的区别

  1. 优先级不一样:Intent设置方式的优先级 > Manifest设置方式,即之前者为准

  2. 限定范围不一样Manifest设置方式没法设定FLAG_ACTIVITY_CLEAR_TOP;Intent设置方式没法设置单例模式(SingleInstance)

4、总结

本文介绍了Activity的四种启动模式(standard、singleTop、singleTask、singleNewInstance)和设置启动模式的方法(launchMode、Intent_Flag)

相关文章
相关标签/搜索