Android面试(9): Activity的四种启动模式对比

本文详细介绍了Android中Activity的四种启动模式:standard、singleTop、singleTask和singleInstance,包括它们的工作原理和应用场景。standard模式下,每次启动Activity都会创建新实例;singleTop模式会在Activity位于栈顶时复用实例;singleTask模式确保同一任务栈内Activity的唯一性;singleInstance模式则使Activity独占一个任务栈。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Activity四种启动模式: standard(标准模式)、singleTop(栈顶复用模式)、singleTask(栈内复用模式)、singleInstance(单实例模式)。Android 中默认启动模式为 standard,我们可以通过在 AndroidManifest.xml 的 activity 标签下通过 launchMode 属性指定我们想要设置的启动模式。

standard(标准模式)
    标准模式,系统默认模式。每次启动一个 Activity 都会重新创建一个新的实例,不管这个实例是否已经存在。这是一种典型的多实例实现,一个任务栈中可以有多个实例,每个实例也可以属于不同的任务栈。在这种模式下,谁启动了这个 Activity,那么这个 Activity 就运行在启动它的那个 Activity 所在栈中。

singleTop(栈顶复用模式)
    栈顶复用模式。在这种模式下,如果新 Activity 已经位于任务栈的栈顶,那么此 Activity 不会被重新创建,同时它的 onNewIntent 方法会被回调,通过此方法的参数我们可以取出当前请求的信息。如果新 Activity 的实例已存在但不是位于栈顶,那么新 Activity 仍然会重新创建。

singleTask(栈内复用模式)
    栈内复用模式。这是一种单实例模式,在这种模式下,只要 Activity 在一个栈中存在,那么多次启动此 Activity 都不会重新创建实例,和 singleTop 模式一样,系统也会回调其 onNewIntent。
    注意,这里我们分 3 种情况来理解这个 launchMode:
    1. 被启动的 Activity 任务栈不存在:
        此时会新建一个该 Activity 的任务栈,并将 Activity 实例放到任务栈中。
    2. 被启动的 Activity 任务栈存在,但是任务栈中该 Activity 实例不处于栈顶而在栈内:
        此时会先将该 Activity 实例上面的其它 Activity 实例全部出栈(因为该启动模式默认具有 clearTop 效果)并将要启动的 Activity 实例置于栈顶,系统调用其 onNewIntent 方法。
    3. 被启动的 Activity 存在任务栈,而且该 Activity 实例在该任务栈栈顶位置:
        直接复用任务栈中的该 Activity 实例,并调用其 onNewIntent 方法。

    这里我们还需要注意一个 Activity 的属性 TaskAffinity,可以翻译为任务相关性。它标识了一个 Activity 所需要的任务栈的名字,默认情况下,所有 Activity 所需的任务栈的名字为应用的包名。这个属性主要和 singleTask 启动模式或者 allowTaskReparenting 属性配对使用,在其它情况下没有意义,为这个启动的 Activity 的任务栈指定相应的名称。

singleInstance(单实例模式)
    单实例模式。这是一种加强的 singleTask 模式,它除了具有 singleTask 模式的所有特性外,还加强了一点,那就是具有此种模式的 Activity 只能单独地位于一个任务栈中。

参考自主席的《Android 开发艺术探索》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值