某App先后打开两个活动,此时活动栈的变动情况如下图所示。
依次结束已打开的两个活动,此时活动栈的变动情况如下图所示。
在配置文件中指定启动模式
打开AndroidManifest.xml,给activity节点添加居性android:launchMode,属性值填入standard表示采取标准横式,当然不添加属性的
话默认就是标准模式。具体的activity节点配置内容示例如下:
<activity android:name=".JumpFirstActivity" android:launchMode="standard" />
其中launchMode属性的几种取值说明见
默认启动模式 standard
该模式可以被设定,不在 manifest 设定时候,Activiy 的的默认模式就是 standard。在该模式下,启动的 Activity 会依照启动顺序被依次压入 Task 栈中:
栈顶复用模式 singleTop
在该模式下,如果栈顶 Activity 为我们要新建的 Activity(目标Activity),那么就不会重复创建新的 Activity。
适合开启渠道多、多应用开启调用的 Activity,通过这种设置可以避免已经创建过的 Activity 被重复创建,多数通过动态设置使用。
栈内复用模式 singleTask
与 singleTop 模式相似,只不过 singleTop 模式是只是针对栈顶的元素,而 singleTask 模式下,如果 task 栈内存在目标 Activity 实例,则将 task 内的对应 Activity 实例之上的所有 Activity 弹出栈,并将对应 Activity 置于栈顶,获得焦点。
应用场景
程序主界面:我们肯定不希望主界面被创建多次,而且在主界面退出的时候退出整个 App 是最好的效果。
耗费系统资源的Activity:对于那些及其耗费系统资源的 Activity,我们可以考虑将其设为 singleTask模式,减少资源耗费。
全局唯一模式 singlelnstance
在该横式下,我们会为目标 Activity 创建一个新的 Task 栈,将目标 Activity 放入新的 Task,并让目标 Activity获得焦点。新的 Task 有且
只有这一个 Activity 实例。
如果已经创建过目标 Activity 实例,则不会创建新的 Task,而是将以前创建过的 Activity 晚醒。
登录成功后跳转方式
登录成功后跳转方式,避免返回键重新返回到登录页。
设置启动标志:跳转到新页面时,栈中的原有实例都被清空,同时开辟新任务的活动栈
Intent intent = new Intent(this,TextViewActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
按位或运算符
运算规则:0|0=0 0|1=1 1|0=1 1|1=1
总结:参加运算的两个对象只要有一个为1,其值为1。
例如:3|5即 0000 0011|0000 0101 = 0000 0111, 因此,3|5的值得7
在代码里面设置启动标志
启动标志的取值说明如下:
Intent.FLAG_ ACTIVITY_NEW_TASK:开辟一个新的任务栈
Intent.FLAG ACTIVITY_SINGLE_TOP: 当栈顶为待跳转的活动实例之时,则重用栈项的实例
Intent.FLAG ACTIVITY_CLEAR_TOP:当栈中存在待跳转的活动实例时,则重新创建一个新实例
并清除原实例上方的所有实例
Intent.FLAG ACTIVITY_NO_HISTORY:栈中不保存新启动的活动实例
Intent.FLAG ACTIVITY_CLEAR_TASK:跳转到新页面时,栈中的原有实例都被清空