Activity启动模式及应用场景

在Android中,Activity的启动模式一共有四种:standard(标准模式),singleTop(栈顶复用模式),singleTask(栈内复用模式),singleInstance(单实例模式)。

要设置Activity的启动模式有两种方式:①直接在Manifest清单文件中,对应的Activity节点的launchMode属性中设置。②在调用startActivity方法的时候,在初始化参数Intent时,调用addFlags或者setFlags方法设置启动模式。其中②的优先级高于①,如果同时在清单文件和Intent中设置启动模式,那么遵循Intent中设置的启动模式。

下面分别描述四种启动模式和应用场景:

一、standard(标准模式):Activity的默认启动模式。每次开启新Activity,系统都会创建一个新的实例,放入任务栈中。每次按下BACK键,栈都会弹出一个Activity实例,直到栈空,栈空之后,系统就会回收这个任务栈。

设置方法:Android中Activity的默认启动模式就是standard,无需特意指定。如果想要特意指定,那么在清单文件中设置

二、singleTop(栈顶复用模式):如果Activity位于栈顶,那么不会创建该Activity的新实例。Intent参数会在Activity的onNewIntent方法中调用。如果Activity不在栈顶,那么会创建新的实例,这时候就跟standard启动模式执行的过程一样。

适用情境:接收通知的界面,浏览器的书签页等等。

设置方法:清单文件中设置

singleTop" />
或者在代码中指定启动模式

Intent intent = new Intent(this, TargetActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);

三、singleTask(栈内复用模式):单实例模式。如果Activity在栈中不存在实例,那么就会创建新的实例,并放到栈顶。

如果栈中存在Activity的实例,那么就不会创建新的Activity实例,但是会执行Activity中的onNewIntent方法,并显示Activity。这时,如果显示Activity之前,栈内存在其他Activity在目标Activity之上的话,这些Activity都会被弹出栈,被销毁。也就是执行clearTop过程。

注意:clearTop过程可以手动开启,开启方法是在代码中设置Intent的参数(在清单文件中无法设置该标识)。

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

适用情境:这种设计模式比较适合H5 WebApp,或者原生应用的程序入口点界面。对于WebApp来说,程序的跳转都在Web页载体的Activity中完成,所以这个Activity就承载应用的总体流程,只需要一个实例就够了。

设置方法:清单文件中设置

singleTask" />
或者在代码中指定启动模式

Intent intent = new Intent(this, TargetActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

四、singleInstance(单实例模式):该模式的实例单独位于一个任务栈中。在Activity A启用singleInstance之后,通过Activity B还想跳转到Activity A时,会直接复用Activity A。

适用情境:适用于与应用分离的Activity,如闹铃的提醒界面和闹铃的设置界面。

注意:singleInstance模式不适用于应用的中间页面,因为当切换到中间页面的时候,应用后台的任务栈(singleInstance Activity所在的任务栈)会切换到前台,当用户按BACK键,或者用户按HOME健到桌面之后再返回应用时,会造成界面跳转混乱,不利于控制界面跳转流程。

设置方法:清单文件中设置

singleInstance" />
该模式无法在代码中实现。


关于任务栈:任务栈可以在清单文件中的Activity节点的taskAffinity属性中设置,格式是字符串。默认值是应用包名。

你可能感兴趣的:(Android)