Android——Activity的四种启动模式

简介:
我们一个程序会存在不同的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"

猜你喜欢

转载自blog.csdn.net/News53231323/article/details/113976751