简介:
我们一个程序会存在不同的Activity,也会存在许多实例,这些实例就会进入任务栈中,任务栈采用“后进先出”的算法,例如:我们使用手机,打开QQ,在QQ界面进入一个聊天界面,此时存在两个Activity实例,假设我们按一下back键我们将回到QQ主界面,在按一下back键我们将回到屏幕主界面,这就是“后进先出”。
Activity的四种启动模式
standard:
系统默认使用此启动模式,特性:无论实例存在与否,每启动一次就创建一个实例,如下图所示
singleTop:
此启动方法分为两种情况。
一:例如一个任务栈中存在ABCD四个实例,且在D中启动一个启动方法为singleTop的实例D,因为此时任务栈中已经存在D,因此系统会回调OnNewIntent()方式。任务栈中的实例依然为ABCD。
二:依旧任务栈中存在ABCD四个实例,在D中启动一个启动方法为singleTop的实例B,因为B已经存在任务栈中,但并为在栈顶,因此想要启动B,必须创建一个实例B位于栈顶,但之前存在的实例B并未改动,因此任务栈中为ABCDB。
下图为第一种情况:
singleTask:
此模式与singleTop模式举的第一个例子一样,但如果想在ABCD任务栈中启动一个启动方法为singleTask的实例B,因为singleTask具有clearTop,所有会把比实例B前面的实例清除掉,所有此时任务栈中只存在AB。如下图所示:
singleInstance:
是singleTask的增强版,具有它的所有特性,还具有用此启动模式启动的activity只能单独处于一个任务栈。
说了四种启动模式,接下来介绍两种方法在哪里设置启动模式,一种是在清单文件中添加,一种是动态添加。
我们先介绍第一种
一:
我们可以看到有四种启动模式可供选择
二:
Intent intent = new Intent(); intent.setClass(this,MainActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);//设置启动模式 startActivity(intent);
优先级:如果两种方式同时存在,我们以设置标志位为优
Activity常用的Flags:
Intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); //指定singleTask模式,与在AndroidManifest.xml中指定android:launchMode"singleTask"效果相同 Intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); //指定singleTop模式,与在AndroidManifest.xml中指定android:launchMode"singleTop"效果相同 Intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); //具有这个标志的Activity启动时,在同一个任务栈中所有位于它上面的Activity都要出栈,一般会和singleTask模式一起出现,可以理解为我们举例的singleTask第二个例子 Intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); //具有这个标志的Activity不会出现在历史的Activity列表中,它等同于在AndroidManifest.xml中指定android:excludeFromRecents="true"