在 Android 中,Activity 的启动模式(Launch Mode)决定了新 Activity 实例如何被创建或复用到任务栈(Task Stack)中。singleTask、singleInstance和 singleTop是三种常用的非标准启动模式,核心区别在于实例唯一性、任务栈行为和复用逻辑。以下是具体对比:
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 是栈顶),C是 singleTask且 taskAffinity=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 |
|---|---|---|---|
|
实例位置 |
当前任务栈的栈顶(可多实例) |
特定任务栈(一栈一实例) |
独立任务栈(全局一实例) |
|
复用条件 |
目标在栈顶 |
目标在任务栈中(任意位置) |
目标在独立栈中 |
|
任务栈影响 |
不创建新栈(或按 |
可能创建新栈,或清理栈顶以上 |
强制创建新栈,且栈仅含自身 |
|
典型场景 |
通知/消息页(如新闻详情) |
主界面(如 |
独立功能(如来电、闹钟) |
补充:onNewIntent() 调用
当 Activity 以 singleTop/singleTask/singleInstance模式启动且实例已存在时,系统会复用旧实例,并调用 onNewIntent(Intent)传递新数据(原 onCreate()不会被调用)。需注意在 onNewIntent()中重新获取 Intent 数据。
总结:选择启动模式时需根据业务需求:
-
避免栈顶重复用
singleTop; -
主界面/需清理回退栈用
singleTask; -
完全隔离的独立功能用
singleInstance。

2820

被折叠的 条评论
为什么被折叠?



