Activity启动模式
2017-11-29 本文已影响10人
pkxutao
Activity启动模式
singlTop 栈顶复用模式
如果该模式的Activity位于栈顶,则启动该Activity不会重新创建,相应的onCreat、onStart不会被调用,onNewIntent被调用
singleTask 栈内复用模式
这是一种单实例模式。只要Activity在一个栈中存在,那么多次启动Activity都不会重新创建实例,onNewIntent会被调用
Activity的Flags
FLAG_ACTIVITY_NEW_TASK
这个标记的作用是为Activity指定“singleTask”启动模式
FLAG_ACTIVITY_SINGLE_TOP
这个标记的作用是为Activity指定“singleTop”启动模式
FLAG_ACTIVITY_CLEAR_TOP
当它启动时,在同一个任务栈中所有位于它上面的Activity都要出栈
实践
在工作时,经常需要做一个“回到首页”功能,即点击一个按钮回到最初始的界面(MainActivity)。
这个功能可以通过两个flag完成:FLAG_ACTIVITY_NEW_TASK && FLAG_ACTIVITY_CLEAR_TOP。例如:一个任务栈中有ABCD四个Activity,现在需要回到A,BCD出栈,
如果现在只设置了FLAG_ACTIVITY_NEW_TASK,则任务栈变成BCDA,
如果只设置FLAG_ACTIVITY_CLEAR_TOP,任务栈会变成ABCDA,所以两者缺一不可
任务栈
参数:TaskAffinity
这个参数标识了一个Activity所需要的任务栈的名字,默认情况下,所有Activity所需的任务栈的名字为应用的包名。我们可以为每个Activity都单独指定TaskAffinity,TaskAffinity主要和singleTask启动模式或者allowTaskRepatenting属性配对使用,在其他情况下没有意义。
分类
分为前台任务栈和后台任务栈,后台任务栈中的Activity位于暂停状态,用户可以通过切换将后台任务栈再次调到前台,例如:所有属性默认情况下,启动一个APP,桌面Activity所在的任务栈变成后台任务栈,APP的Activity所在的任务栈变成前台任务栈
使用方法
Intent intent = new Intent();
intent.setClass(context, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
context.startActivity(intent);
或者
<activity
android:name=".MainActivity"
android:launchMode="singleTop"
android:screenOrientation="portrait" >
setFlags和addFlags区别
其实从方法名字上就可以区分,setFlags会替换之前的flag,addFlags是在原来基础上添加flag,来看源码:
public Intent setFlags(int flags) {
mFlags = flags;
return this;
}
public Intent addFlags(int flags) {
mFlags |= flags;
return this;
}