问题:Android的四种启动模式分别是什么
先说答案:
standard,singleTop,singleTask,singleInstance
总结分析:
Activity的启动模式决定了Activity实例在任务栈中如何被管理。
Android提供了四种不同的启动模式,每种模式适用于不同的应用场景:
1、standard(标准模式)
默认的启动模式
每次启动的时候都会创建Activity新的实例,不管这个Activity是否存在
实例将会推入调用者Activity所在的任务栈中
2、singleTop(栈定复用模式)
if(Activity在栈顶){
调用activity的onNewInstance()方法
}else{
创建新的实例
}
3、singleTask(栈内复用模式)
if(栈内存在){
清除activity上面的所有其他的activity
然后调用activity的onNewInstance()方法
}else{
创建新的实例
}
4、singleInstance(单实例模式)
启动的时候会为这个activity单独开一个任务栈,而且这个任务栈只有这一个activity,不会新增其他的activity,这个任务栈这个activity独享
需要注意的是比如:B是singleInstance A、C是其他三种启动任意
A -> B -> C
这时候C返回不会返回到B 而是返回到A
在A和C的这个栈都结束后回到B
总结就是自己开了一个栈 跳转到别的页面之后 在别的页面执行的返回会返回他们的栈内的activirty 没的返回才到你自己一个栈
感兴趣自己代码敲一下吧~
除了这四种启动模式,Intent标志也可以用来控制活动如何与任务栈交互。常用的Intent标志包括:
FLAG_ACTIVITY_NEW_TASK:
如果设置,将在一个新的任务中启动活动。如果任务已经存在,它将被带到前台。
FLAG_ACTIVITY_SINGLE_TOP:
如果设置,活动的实例已在栈顶,则不会创建新的实例。
FLAG_ACTIVITY_CLEAR_TOP:
如果设置,在该活动上方的所有活动都将被清除,该活动将成为新的栈顶。
让我们通过一个实际的例子来解释这些Intent标志的行为。
假设我们有三个活动:活动A、活动B和活动C。我们的目标是从活动A跳转到活动B,然后跳转到活动C。
在活动C中,我们想要通过一个意图(Intent)返回到活动A,并清除所有其他活动。
无任何标志的情况:
用户在活动A中点击一个按钮,通过一个意图启动活动B。
Intent intentToB = new Intent(A.this, B.class);startActivity(intentToB);
然后,在活动B中,用户点击另一个按钮通过意图启动活动C。
Intent intentToC = new Intent(B.this, C.class);startActivity(intentToC);
此时任务栈情况为:
[ ... A, B, C ](C在栈顶)
使用FLAG_ACTIVITY_NEW_TASK和FLAG_ACTIVITY_CLEAR_TOP:
如果在活动C中,用户想要回到活动A,并清空所有在A和C之间的活动(例如B),可以设置FLAG_ACTIVITY_NEW_TASK和FLAG_ACTIVITY_CLEAR_TOP。
Intent intentToA = new Intent(C.this, A.class);intentToA.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);startActivity(intentToA);
此时任务栈情况会变为:
[ ... A ](A在栈顶,B和C都被清除)
如果当前任务栈情况为:
[ ... B, A, C ](C在栈顶)
我们在C中这么启动A:
IntentintentToA=newIntent(C.this,A.class);
intentToA.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intentToA);
然后任务栈会变为:
[ ... B, A, C, A ](新的A实例在栈顶)因为A不在栈顶所以flag无效 如果A在栈定的话
[ ... B, A ]就成立啦
网友评论