任务栈Task ,是一种用来放置Activity实例的容器,他是以栈的形式进行盛放,也就是所谓的先进后出,主要有2个基本操作:压栈和弹出,所以在其中只能根据压栈和弹出操作更改Activity的顺序。启动一个Application的时候,系统会为它默认创建一个对于的Task,用来放置根Activity。
Android软件开发学习Activity组件启动模式方法
Activity启动模式
在安卓中,Activity的启动模式分为四种,分别是:标准模式,栈顶复用模式,栈内复用模式,单例模式。
1、standard 即标准模式,他是系统默认的启动方式,这个任务栈中可以有多个相同的Activity实例,多个相同Activity实例也可以分布在不同的任务栈中,这时候是谁启动他,他就和谁在一个任务栈中。这时候我们要联系到我们遇到过的一个常:android.util.AndroidRuntimeException:....,具体内容大家试试这样启动一个Activity就会出来,使用ApplicationContext启动一个standard模式的Activity。我们分析下,其实这个错误的出现就是因为默认模式下,被谁启动,activity就翻到那个任务栈中去,而全局的上下文对象是没有任务栈存在的,所以就会报错了。解决这个问题可以更改启动的上下文为某个activity对象,当然我们如果将被启动的activity设置他的标志位为FLAG_ACTIVITY_NEW_TASK 也同样可以,这时候就相当于把Activity改为了singleTask模式启动了。
2、singleTop 即栈顶唯一模式,这种模式下,如果Activity位于任务栈的栈顶,那么此Activity不会被重新创建,也就是说 不会调用 生命周期中的 onCreate和onStart 方法,但是 会回调 另一个方法 onNewIntent ,这时候我们可以在这个回调方法里根据参数Intent intent进行自己的相关处理。如果新启动的Activity实例不存在,或者存在但是不是位于栈顶,那么和正常一样的创建它。
3、singleTask 即栈内唯一,这个其实是一种单例模式,只要这个任务栈中存在Activity的实例,那么就不再创建它,而是直接复用其实例,这时候也会回调onNewIntent。这时候有个问题,这个实例如果不是在栈顶,那么它要到栈顶来,唯一途径就是把它之前的实例全部弹出,实际上就是说singleTask具有clearTop的效果。当然这是简单的说明,下面通过几个例子帮助大家更好的理解:
例1.目前有S1任务栈中有ABC,这个时候要启动Activity D并且D是singleTask模式,其所需的任务栈为S2(之所以不是S1因为为他指定了affinity属性),这时候由于S2和D都不存在,所以会先创建任务栈S2,然后在创建实例D压入栈底。
例2.情况和1相同,只是D所需任务栈同样是S1,这时候就只要创建D的实例并将其压入到栈S1中即可。
例3.如果D所需的任务栈为S1,并且当前S1中的情况为ADBC,这时候D的实例存在了,那么会将BC出栈,剩下AD,这就是singleTask默认具有clearTop的效果
4、singleInstance 单例模式,这是一种加强型的singleTask,他具有singleTask的所有特性,并且拥有一个独特的地方就是,他会单独占用一个任务栈,比如Activity A是singleInstance模式,那么启动他的时候,系统会为他单独创建一个任务栈将其压入,如果再次启动他,他已经存在了,那么就直接复用该任务栈。
最后,需要提醒大家注意的一点就是TaskAffinity这个属性主要是与singleTask或者allowTaskReparenting属性配对使用,在其他情况下是没有意义的。
Activity标志位
Activity的标志位Flags有很多种,其效果也有很多,比如可以用来设定启动模式,可以用来影响运行状态,下面介绍几个常用的标志位:
1、FLAG_ACTIVITY_NEW_TASK
该标志位作用于指定Activity的singleTask启动模式一样。
2、FLAGE_ACTIVITY_SINGLE_TOP
该标志位的作用和指定Activity的singleTop效果一致。
3、FLAGE_ACTIVITY_CLEAR_TOP
此标记位的效果就有意思了,拥有它的Activity会将与他在同一个任务栈中之前Activity都出栈,这个标志通常和singleTask配合使用时,如果实例存在,就调用他的onNewIntent,并将他之上的其他实例都清除,但是如果拥有该标志位的Activity是默认启动模式standard,那么他会连同自己一起清除,然后再重新创建实例,这点要注意好,所以之前我们说了singleTask默认具有此标志的效果。
Activity设置启动模式的方式
在Android中,设置Activity的启动模式主要有以下两种方式:
1、在XML文件中定义 android:launchMode="singleTask"
2、在启动意图的时候设置:intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
上述这两种方式,在使用主要有以下两个区别:
1、优先级
优先级第二种大于第一种,当俩种方式同时存在的时候以第二种方式为准,第一种方式为辅。
2、适用范围
俩种方式也存在适用范围的区别,第一种方式无法直接为Activity设定FLAG_ACTIVITY_CLEAR_TOP标志的效果,而第二种方式无法直接设置出singleInstance模式的效果。