Activity的启动模式,是我们Android开发经常用到,也是面试官经常随口要你回答的一个点。
接下来我们了解一下。
任务栈是什么
任务栈Task,是 一种存放Activity实例的容器,他是以栈的形式进行存放,也就是以先进后出,压栈和出栈。
在启动Application的时候,系统会默认创建一个Task进行Activity的存放,默认启动Activity会放在同一个栈,新启动的Activity会被压入默认的栈中,并显示它。当用户finish界面或者按下后退按钮时,这个Activity就会出栈。
当按Home键、并启动另一个应用的时候,我们本身的栈就会移动到后台,成为后台任务栈,然而新启动到前台的应用,他的Task被成为前台任务栈。
Android的四种启动模式:
- standard:标准默认模式
1.例如A Activity启动B Activity,B Activity创建在A Activity的任务栈中;
2.每次启动一个Activity都会创建新的实例,无论这个Activity是否已存在任务栈中;
- singleTop:栈顶复用模式
例如A Activity启动B Activity,判断A的任务栈栈顶是否存在B这个实例,如果存在那就不创建新的
的B Activity而是直接引用这个栈顶的实例B Acitivity。如果不存在那就创建新的B Activity.
- singleTask:栈内复用模式
当你要创建的Activity不存在栈中,那就如常创建。若存在栈中那不会重新生成一个新的实例,会使用使用,
并且将该Activity之上的所有Activity从该栈中移除,使得你要创建的Activity处于栈顶。
- singleInstance:单实例模式
该模式具有singleTask的所有特性外,还具有属于自己的特性。那是该模式的Activity会单独存在一个任务栈中
不与其他Activity共存在同一个任务栈中。他可以理解成在系统范围中唯一实例,如果在当前栈中找不到,
会在系统的其他栈查找,找到直接使用,否则如刚刚所说的创建属于自己的栈。
两种方法给 Activity 指定启动模式:
1.通过 AndroidMenifest 给 Activity 指定启动模式:
<activity android:name=".SecondActivity"
android:launchMode="singleTask"/>
2.通过在 Intent 中设置标志位来为 Activity 指定启动模式:
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
设置常用的Intent的Flag
- FLAG_ACTIVITY_NEW_TASK:
使用一个新的Task来启动一个Activity,但启动的每个Activity都将在一个新的Task中。
- FLAG_ACTIVITY_SINGLE_TOP:
这个标记位的作用是为 Activity 指定 “singleTop” 启动模式。
- FLAG_ACTIVITY_CLEAR_TOP:
这个标记位的作用是为 Activity 指定 “singleTask” 启动模式。
- FLAG_ACTIVITY_NO_HISTORY
Activity使用这个模式启动,当该Activity启动其他Activity,该Activity就会消失了,不会保留在Activity栈中。
这些都是一些属于基础的知识,在面试的时候会出现在笔试、或者面试官随口一问的情况,需要你自信流利地回答的一个常见问题。