Activity的四种启动模式

Android Activity启动模式解析
本文详细介绍了Android中Activity的四种启动模式:standard、singleTop、singleTask和singleInstance,每种模式的特点及应用场景,并通过具体例子说明它们如何影响Activity的生命周期。

activity有四种启动模式,可以在AndroidManifest.xml里对应的<activity>标签中设置android:launchMode属性的值为这四种其中之一

standard(标准)

默认的启动模式,在AndroidManifest没有配置的情况下默认就是这种启动模式。在这个模式下,activity的每次启动都会默认创建一个新的实例。所以在这个模式下,可以有多个相同activity的实例。

singleTop(单一栈顶)

这个模式下,不允许多个相同activity的实例叠加,即假设有activity A B,A打开B,B又再次打开B,这个时候所在的activity是B,并且栈里面也只有A B,即如果打开的activity已经在栈顶有一个相同的实例,则不会新建一个实例,而是执行栈顶这个实例的onNewIntent方法以刷新这个activity。

singleTask(单一任务)

我们知道activity的储存是用任务栈的形式,该模式下只要任务栈内存在该activity的实例,就把该activity的实例之后的所有activity的实例都弹栈,并且调用这个实例的onNewIntent方法以刷新这个activity。即假设说有activity A B C,A打开B,B打开C,如果这个时候在C中打开A的话,那么现在我们所在的activity是A,并且栈里面也只剩A了,同理,A打开B,B打开C,这时C打开B,栈里面的就是A和B,现在所在的就是B。

singleInstance(单一实例)

顾名思义,单一实例,即该activity每次创建实例时,任务栈中都有且只有该实例,即假设现在有栈1,栈内有activity A的实例,A打开singleInstance模式的activity B的实例,B不会在栈1内,而是新建一个栈2,自己单独存在于栈2内,而栈2内的B假设打开一个默认模式的activity C的实例,那么现在的情况是栈1内有A C,栈2有B

Android中Activity启动模式(Launch Mode)定义了Activity在任务栈中的行为方式。共有四种启动模式:`standard`、`singleTop`、`singleTask`和`singleInstance`,它们决定了Activity实例的创建方式、任务栈的归属以及如何响应启动请求。 ### `standard` 模式 这是默认的启动模式。每次启动该模式的Activity时,都会创建一个新的实例,并将其压入启动它的Activity所在的任务栈中。即使该Activity已经在栈顶,也不会复用,而是新建一个实例[^4]。 ### `singleTop` 模式 如果目标Activity已经位于任务栈的栈顶,则不会创建新的实例,而是直接使用栈顶的实例,并调用其`onNewIntent()`方法。但如果该Activity不在栈顶,或者任务栈不存在,则仍然会创建新的实例。此模式适用于某些需要避免重复创建栈顶实例的场景,例如通知栏点击跳转。 ### `singleTask` 模式 这种模式的Activity在系统中只会存在一个实例。系统会在启动该Activity时查找是否存在一个任务栈中已经包含该实例。如果存在,则不会创建新实例,而是将该任务栈带到前台,并结束位于该Activity实例之上的所有其他Activity,使其位于栈顶;如果不存在,则会创建一个新的任务栈并放入该实例作为根Activity[^3]。需要注意的是,官方文档虽然指出该模式的Activity通常作为任务的根Activity,但实际行为取决于任务栈的配置和启动上下文。 ### `singleInstance` 模式 该模式的Activity在整个系统中只有一个实例,并且该实例独立存在于一个单独的任务栈中。任何应用启动该Activity时,都会使用这个全局唯一的实例,并将其任务栈置于前台。适用于需要全局共享的界面,例如全局设置或登录界面。由于该模式的Activity独占一个任务栈,后续的Activity启动不会压入该栈中,而是进入其他任务栈。 ## 启动模式的区别总结 - **实例唯一性**:`standard`和`singleTop`允许在多个任务栈中存在多个实例;`singleTask`确保一个系统内仅有一个实例;`singleInstance`确保全局唯一实例并独立任务栈。 - **任务栈行为**:`standard`和`singleTop`的实例压入启动它们的Activity所在任务栈;`singleTask`可能复用已有任务栈或新建任务栈;`singleInstance`始终位于独立任务栈。 - **复用机制**:`standard`始终新建实例;`singleTop`仅在栈顶时复用;`singleTask`在系统中复用;`singleInstance`全局复用。 ### 示例代码:在AndroidManifest.xml中设置启动模式 ```xml <activity android:name=".MainActivity" android:launchMode="singleTask" /> ``` ### 示例代码:通过Intent启动不同模式的Activity ```java Intent intent = new Intent(this, TargetActivity.class); startActivity(intent); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值