一、启动模式
Activity有四种启动模式,他们分别是:
(1)standard(系统默认的启动模式):标准模式,符合标准返回栈的原则,每次启动一个活动(不管返回栈中存不存在这个活动)时,都会将启动的活动压入返回栈中。
(2)singleTop:在启动活动时如果发现返回栈的栈顶已经是该活动,则认为可以直接使用它,不会再创建新的实例,否则就会启动新的活动压入栈顶,
(3)singleTask:每次创建一个活动时系统首先会在目标返回栈中检查是否存在该活动的实例,如果发现已经存在则直接使用该实例,并将该活动以上的活动推出栈,如果不存在就会启动新的活动,并压入栈顶。
这里提到了目标返回栈,这就和Activity的另一个属性taskAffinity有关系了,这个参数标识了一个活动的目标返回栈,默认情况下,所有活动的目标返回栈的名字为应用的包名;当设置这个属性值时不能是敏感词汇和应用包名。设置完成后,如果之前存在这个名字的返回栈,则直接使用,如果没有则创建该返回栈。
(4)singleInstance:创建一个新的返回栈来管理唯一的活动(这个返回栈中,只能有这一个活动),不管是哪个应用程序来访问这个活动,都共用的同一个返回栈,也就解决了不同应用程序共享活动实例的问题。
问题解答
1、问:有A、B、C三个返回栈,且三个栈中都有活动,当C栈中所有活动都出栈后,会显示A、B哪个栈中的活动?
1、答:栈之间的关系会遵循最近使用原则。当C栈中的活动全部出栈后,会显示在C栈开始之前的返回栈中的活动。
2、问:有A、B、C三个活动,且B活动的启动模式是singleInstance,当A启动B,B启动C时,C活动位于哪个返回栈?
2、答: C活动会位于A的返回栈中。
3、问: 有A、B、C三个活动,且B活动的启动模式是singleTask,taskAffinity属性值是非包名,当A启动B,B启动C时,C位于哪个返回栈中?
3、答: 在一般情况下被启动的活动,会被置于启动它的返回栈中。所以C会位于B的返回栈中。特例看第2问。
二、Intent常用Flag
简单使用实例:
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);//通过Intent.FLAG_ACTIVITY_NO_HISTORY标签启动SecondActivity活动,相当于SecondActivity的启动模式是FLAG_ACTIVITY_NO_HISTORY
startActivity(intent);
(1)Intent.FLAG_ACTIVITY_NEW_TASK ——在不搭配taskAffiinity属性时作用和Intent.FLAG_ACTIVITY_CLEAR_TOP相同。在搭配taskAffinity时作用和singtask相同。
(2)Intent.FLAG_ACTIVITY_CLEAR_TOP —— 作用和singtask在不搭配taskAffinity的情况下相同。
(3)Intent.FLAG_ACTIVITY_SINGLE_TOP ——-作用和singTop相同。
(4)Intent.FLAG_ACTIVITY_NO_HISTORY —— 当活动执行onStop()就会出栈。