一、四种启动方式
Standard
默认模式,可以不用写配置。在这个模式下,都会默认创建一个新的实例。因此,在这种模式下,可以有多个相同的实例,也允许多个相同Activity叠加。
SingleTop
可以有多个实例,但是不允许多个相同Activity叠加。即,如果Activity在栈顶的时候,启动相同的Activity,不会创建新的实例,而会调用其onNewIntent方法。
SingleTask
只有一个实例。在同一个应用程序中启动他的时候,若Activity不存在,则会在当前task创建一个新的实例,若存在,则会把task中在其之上的其它Activity destory掉并调用它的onNewIntent方法。
如果是在别的应用程序中启动它,则会新建一个task,并在该task中启动这个Activity,singleTask允许别的Activity与其在一个task中共存,也就是说,如果我在这个singleTask的实例中再打开新的Activity,这个新的Activity还是会在singleTask的实例的task中。
SingleInstance
只有一个实例,并且这个实例独立运行在一个task中,这个task只有这个实例,不允许有别的Activity存在。
二、使用方法
在清单文件中设置
android:launchMode="singleTop"
在Intent中添加Flag指定启动模式,比如在Service启动Activity时需要用到这种方式
Intent intent = new Intent();
intent.setClass(context, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
注意动态设置要比静态设置优先级要高
Flag的对应关系
Flag | 清单文件 | 属性说明 |
---|---|---|
FLAG_ACTIVITY_NEW_TASK | SingleTask | 作用是为Activity指定 “”启动模式。跟在AndroidMainfest.xml指定效果同样 |
FLAG_ACTIVITY_SINGLE_TOP | SingleTop | 作用是为Activity指定 “”启动模式,跟在AndroidMainfest.xml指定效果同样。 |
FLAG_ACTIVITY_CLEAN_TOP | SingleTask | 具有此标记位的Activity,启动时会将与该Activity在同一任务栈的其他Activity出栈。一般与SingleTask启动模式一起出现。它会完毕SingleTask的作用。但事实上SingleTask启动模式默认具有此标记位的作用 |
FLAG_ACTIVITY_NO_HISTORY | 使用该模式的Activity在启动其他Activity后变会自动销毁 | |
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS | android:excludeFromRecents="trure" | 具有此标记位的Activity不会出如今历史Activity的列表中,使用场景:当某些情况下我们不希望用户通过历史列表回到Activity时,此标记位便体现了它的效果 |
三、应用场景
SingleTask
最常见的应用场景就是保持我们应用开启后仅仅有一个Activity的实例。最典型的样例就是应用中展示的主页(Home页)。
假设用户在主页跳转到其他页面,运行多次操作后想返回到主页,假设不使用SingleTask模式,在点击返回的过程中会多次看到主页,这明显就是设计不合理了
SingleTop
假设你在当前的Activity中又要启动同类型的Activity,此时建议将此类型Activity的启动模式指定为SingleTop,能够降低Activity的创建,节省内存!
//使用SingleTop页面传值可以使用这种方法。
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);//设置新的intent
init();//初始化动作
}
四、参考
Activity启动模式与任务栈(Task)全面深入记录(上)
Activity启动模式与任务栈(Task)全面深入记录(下)