Android提供了四种启动模式,分别是:android
标准模式(Standard)bash
栈顶复用模式(SingleTop)数据结构
栈内复用模式(SingleTask)函数
单例模式(SingleInstance)this
下面依次介绍每种模式的特色,首先了解什么是task,task翻译过来就是“任务”,是一组相互有关联的Activity集合,能够理解为Activity是在task里面活动的。task存在于一个称为back stack的数据结构中,也就是说,task是以 栈的形式去管理Activity的,因此也叫能够称为“任务栈”。综上所述:“任务栈”是Activity的管理方式,采用的是“后进先出”的栈结构,每按一次Back键,就会有一个Activity出栈spa
标准模式,也是系统默认的启动模式,该模式特色:翻译
每启动一次Activity,都会建立一个新的Activity实例在栈顶,无论这个实例在任务栈中是否已经存在。假如 Activity A启动了 Activity B,Activity B则会运行在Activity A所在的任务栈中并处于栈顶位置。code
非Activity类型的context(如ApplicationContext)启动standard模式的Activity时会报错。由于非Activity类型 context 并无任务栈,故没法采用标准模式启动Activity。解决办法能够为待启动Activity指定 FLAG_ACTIVITY_NEW_TASK标记位,这样启动的时候系统就会为它建立一个新的任务栈。实际上待启动Activity是采用singleTask模式启动的。cdn
栈顶复用模式,该模式特色:xml
若须要新建的Activity位于任务栈栈顶,那么此Activity的实例就不会从新建立,而是复用栈顶的实例。调用Activity的onNewIntent()方法不会调用onCreate()和onStart()方法。
假如Activity A启动Activity B,就会判断A所在的任务栈栈顶是不是B的实例。若是是,则不建立新的Activity B 实例而是直接引用栈顶实例,同时onNewIntent()方法会被回调,经过该方法的参数能够取得当前请求的信息;若是不是,则建立新的Activity B实例。
栈内复用模式,该模式特色:
. 查看Activity想要的任务栈是否存在(经过查找Activity的taskAffinity属性值相匹配的任务栈是否存在),若不存在,则新建一个任务栈并建立该Activity实例压入栈中;若存在,则查看Activity是否在该栈中,若在,则将该Activity实例之上的全部Activity实例出栈,使该Activity实例置于栈顶,执行回调函数onNewIntent()方法。若不在,则建立该Activity实例并压入栈中。
单实例模式,该模式特色:
这个是singleTas模式的增强版,它除了具备singleTask模式的全部特性外,它还有一点独特的特性,那就是此模式的Activity只能单独地位于一个任务栈,不与其 Activity共存于同一个任务栈。
直接建立一个新的任务栈并建立该Activity实例压入栈中。
两种方法能给Activity指定启动模式:
<activity
android:name=".MainActivity"
android:launchMode="singleTask">
</activity>
复制代码
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()方法或者自行结束而后从新建立本身。
优先级不一样:Intent设置方式的优先级 > Manifest设置方式,即之前者为准
限定范围不一样Manifest设置方式没法设定FLAG_ACTIVITY_CLEAR_TOP;Intent设置方式没法设置单例模式(SingleInstance)
本文介绍了Activity的四种启动模式(standard、singleTop、singleTask、singleNewInstance)和设置启动模式的方法(launchMode、Intent_Flag)