文章目录

前言

AI就是AI,超级给力,比我总结的好多了。

Android 中的 Activity 启动模式(Launch Mode)决定了新实例如何被创建以及它如何与任务栈(Task Stack/Back Stack)交互。

Activity主要有四种标准模式

正文

以下是详细的解析:

1. Standard (标准模式)

  • 配置方式:不设置 launchMode 属性,或设置为 standard(默认值)。

  • 行为特点

  • 每次启动都会创建一个新的实例

  • 新实例会被压入当前任务栈的栈顶。

  • 即使栈中已经存在该 Activity 的实例,也不会复用,而是继续创建新的。

  • 典型场景:新闻详情页、邮件列表点击进入详情。用户多次点击会生成多个页面,按返回键会依次关闭。

  • 示例:栈结构 [A, B],再次启动 B ->[A, B, B]

2. SingleTop (栈顶复用模式)

  • 配置方式android:launchMode="singleTop"

  • 行为特点

  • 如果要启动的 Activity 已经位于任务栈的栈顶,则不会创建新实例,而是复用栈顶实例,并调用其 onNewIntent() 方法。

  • 如果该 Activity 在栈中但不在栈顶,或者根本不在栈中,则会创建一个新的实例并入栈。

  • 典型场景:通知栏点击跳转。

    例如,用户已经在聊天界面(栈顶),此时收到新消息通知,点击通知应刷新当前聊天界面而不是再开一个相同的聊天窗口。

  • 示例

  • [A, B],启动 B (B在栈顶) -> 复用 B,调用 onNewIntent,栈仍为 [A, B]

  • [A, B, C],启动 B (B不在栈顶) -> 创建新 B,栈变为 [A, B, C, B]

3. SingleTask (栈内单例模式)

  • 配置方式android:launchMode="singleTask"

  • 行为特点

  • 在整个任务栈中,该 Activity 只有一个实例

  • 如果栈中已存在该实例,系统会将该实例之上的所有其他 Activity 全部出栈(销毁),使该实例成为栈顶,并调用其 onNewIntent() 方法。

  • 如果不存在,则创建新实例并入栈。

  • 通常用于作为应用程序的主入口或主要功能模块。

  • 典型场景:浏览器主页、应用的首页。用户从深层页面跳回首页时,希望清空中间的临时页面。

  • 示例

  • [A, B, C],启动 B (SingleTask) -> 销毁 C,将 B 移至栈顶,调用 onNewIntent,栈变为 [A, B]

4. SingleInstance (单实例模式)

  • 配置方式android:launchMode="singleInstance"

  • 行为特点

  • 该 Activity 独占一个任务栈

  • 系统中只允许存在一个该 Activity 的实例。

  • 无论从哪里启动它,如果它已经存在,都会直接复用并调用 onNewIntent();如果不存在,则创建一个新的任务栈并将它放入其中。

  • 它不能与其他 Activity 共享同一个任务栈。

  • 典型场景:来电显示界面、闹钟提醒界面、系统级的分享选择器。这些界面需要独立于应用的其他流程,且全局唯一。

  • 示例

  • 应用栈 [A, B],启动 C (SingleInstance) -> 创建新栈 [C]

  • 此时系统有两个栈:[A, B][C]

  • 如果在 C 中启动 D (Standard),D 会进入 C 所在的栈(取决于具体实现和 intent 标志,通常 SingleInstance 栈中很少再压入其他普通页面,或者 D 会回到启动者的栈)。注:SingleInstance 的设计初衷通常是让它独立,它启动的其他 Activity 通常会运行在调用者的任务栈中,具体行为较复杂,需谨慎使用。

配合 Intent Flag 使用

除了通过 AndroidManifest.xml 配置,还可以在代码中通过 Intent.addFlags() 动态指定行为,常用的有:

  • FLAG_ACTIVITY_NEW_TASK:效果类似 singleTask,常用于从非 Activity 上下文(如 Service)启动 Activity。

  • FLAG_ACTIVITY_SINGLE_TOP:效果类似 singleTop

  • FLAG_ACTIVITY_CLEAR_TOP:如果目标 Activity 在栈中,清除其上方的所有 Activity。若目标不是 singleTask,则会销毁旧实例并创建新实例;若是 singleTask,则复用旧实例。

总结对比表

模式是否总是新建栈中是否存在即复用是否清除上方元素典型用途
Standard普通页面流转
SingleTop否 (仅当在栈顶)是 (仅当在栈顶)通知栏跳转、避免重复刷新
SingleTask是 (全局唯一)应用主页、浏览器根页
SingleInstance是 (全局唯一) (独占新栈)来电、闹钟、系统级弹窗

参考文章

AI总结

这总结比我以前写的还更好,还是AI给力。

暂无评论

评论审核已启用。您的评论可能需要一段时间后才能被显示。

none
暂无评论...