singleTask 和singleInstance及singleTop的区别

在 Android 中,Activity 的启动模式(Launch Mode)决定了新 Activity 实例如何被创建或复用到任务栈(Task Stack)中。singleTasksingleInstancesingleTop是三种常用的非标准启动模式,核心区别在于实例唯一性任务栈行为复用逻辑。以下是具体对比:

1. singleTop(栈顶单例)

  • 核心逻辑:若目标 Activity 已位于当前任务栈的栈顶,则复用该实例(调用 onNewIntent());否则,创建新实例入栈。

  • 任务栈行为:始终在当前任务栈中操作,不创建新栈(除非通过 taskAffinity显式指定其他栈)。

  • 实例数量:允许同一任务栈中存在多个实例(仅限制栈顶不重复)。

  • 典型场景:接收通知/消息的页面(如新闻详情页),避免重复创建栈顶的相同页面。

示例

任务栈当前状态:A → B → C(C 是栈顶)。

  • 若用 singleTop启动 C:复用 C 实例,调用 onNewIntent(),栈不变。

  • 若用 singleTop启动 B:B 不在栈顶,创建新 B 实例,栈变为 A → B → C → B

2. singleTask(栈内单例)

  • 核心逻辑:系统会检查是否存在与当前 Activity 的 taskAffinity匹配的任务栈(默认与包名相同)。

    • 若存在:该任务栈中若有此 Activity 实例,则将该实例上方的所有 Activity 出栈(销毁),并复用此实例(调用 onNewIntent())。

    • 若不存在:创建新任务栈,将 Activity 放入新栈。

  • 任务栈行为:可能创建新任务栈,或在已有任务栈中复用实例并清理上方 Activity。

  • 实例数量:同一任务栈中仅一个实例,全局可能有多个(不同任务栈)。

  • 典型场景:应用的主界面(如 MainActivity),确保返回时直接回到主界面,清理中间页面。

示例

任务栈 A 状态:A → B → C(A 是栈底,C 是栈顶),CsingleTasktaskAffinity=com.app

  • 若用 singleTask启动 C:C 已在栈 A 中,将 C 上方的 B 出栈(销毁),栈变为 A → C,复用 C 实例。

  • 若用 singleTask启动 D(taskAffinity=com.other):无匹配栈,创建新任务栈 B,D 入栈 B,此时有栈 A 和栈 B。

3. singleInstance(全局单例)

  • 核心逻辑:该 Activity 会独占一个任务栈,且该任务栈中仅包含此 Activity 一个实例

    • 当启动其他 Activity 时,系统会将其放入其他任务栈(而非此栈)。

    • 再次启动此 Activity 时,复用已有实例(调用 onNewIntent()),不创建新栈。

  • 任务栈行为:强制使用独立任务栈,其他 Activity 无法加入此栈。

  • 实例数量:全局仅一个实例(独占一栈)。

  • 典型场景:独立的功能模块(如来电界面、闹钟提醒),需与其他页面完全隔离。

示例

任务栈 A 状态:A → B → C,启动 E(singleInstance)。

  • 系统为 E 创建新任务栈 S,E 入栈 S(栈 S 仅含 E)。

  • 再启动 F(普通模式):F 入栈 A,栈 A 变为 A → B → C → F,栈 S 仍为 E

  • 再次启动 E:切换到栈 S,复用 E 实例,调用 onNewIntent()

关键区别总结

特性

singleTop

singleTask

singleInstance

实例位置

当前任务栈的栈顶(可多实例)

特定任务栈(一栈一实例)

独立任务栈(全局一实例)

复用条件

目标在栈顶

目标在任务栈中(任意位置)

目标在独立栈中

任务栈影响

不创建新栈(或按 taskAffinity

可能创建新栈,或清理栈顶以上

强制创建新栈,且栈仅含自身

典型场景

通知/消息页(如新闻详情)

主界面(如 MainActivity

独立功能(如来电、闹钟)

补充:onNewIntent() 调用

当 Activity 以 singleTop/singleTask/singleInstance模式启动且实例已存在时,系统会复用旧实例,并调用 onNewIntent(Intent)传递新数据(原 onCreate()不会被调用)。需注意在 onNewIntent()中重新获取 Intent 数据。

总结:选择启动模式时需根据业务需求:

  • 避免栈顶重复用 singleTop

  • 主界面/需清理回退栈用 singleTask

  • 完全隔离的独立功能用 singleInstance

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值