欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 美食 > Android Activity 的 launchMode 与 Task Stack 管理

Android Activity 的 launchMode 与 Task Stack 管理

2025/4/1 3:23:48 来源:https://blog.csdn.net/liuzhuo13396/article/details/146584983  浏览:    关键词:Android Activity 的 launchMode 与 Task Stack 管理

Android 中的 android:launchMode 决定了 Activity 在启动时如何在任务栏中管理它的存在方式。下面我们来结合 Task Stack 管理详细解释。


1. android:launchMode 的四种模式

1.1 standard (标准模式, 默认)

  • 启动方式:每次启动都会创建一个新实例并压入栏任务堆中。
  • 应用场景:适用于需要多个实例的场景,比如详情页。
  • 示例配置
    <activity android:name=".StandardActivity"android:launchMode="standard"/>
    

1.2 singleTop (堆顶复用模式)

  • 启动方式:如果标的 Activity 已经在栏顶,则会复用它并调用 onNewIntent();否则依然创建新实例。
  • 应用场景:适用于消息推送页面、搜索页面。
  • 示例配置
    <activity android:name=".SingleTopActivity"android:launchMode="singleTop"/>
    

1.3 singleTask (堆内复用模式)

  • 启动方式:如果任务栏中已经存在该 Activity,则复用它并清除其上的 Activity ;否则创建新实例。
  • 应用场景:适用于 App 主页面。
  • 示例配置
    <activity android:name=".SingleTaskActivity"android:launchMode="singleTask"/>
    

1.4 singleInstance (全局单例模式)

  • 启动方式:每次都在单独的任务栏中启动,全局仅一个实例。
  • 应用场景:适用于蓝牙配对界面、视频播放器。
  • 示例配置
    <activity android:name=".SingleInstanceActivity"android:launchMode="singleInstance"/>
    

2. Android 如何管理 Task Stack

在 Android 中,任务栈(Task Stack)的管理主要由 ActivityManagerService(AMS)TaskSupervisor 负责,具体来说:

2.1 ActivityManagerService(AMS)

  • AMS 是 Android 系统的 核心服务,负责管理 Activity 的生命周期、任务栈以及进程调度。
  • Activity 启动或销毁时,AMS 会根据 launchModeIntent Flags 决定 Activity 是否应该创建新的实例,还是复用已有的 Activity
  • 主要职责:
    • 维护任务栈(Task Stack
    • 处理 Activity 的启动/切换/销毁
    • 进行进程管理和调度

2.2 TaskSupervisor

  • TaskSupervisorAMS 内部的一个类,专门用于管理任务栈(Task)。
  • TaskSupervisor 主要负责:
    • 创建/删除任务栈Task
    • 管理任务栈的切换
    • 根据 launchMode 规则调整 Activity 的位置
    • 清除特定 Activity 之上的 Activity(如 singleTask

2.3 ActivityStack

  • ActivityStack 代表一个 任务栈,它包含一组 ActivityRecord(即 Activity 的实例信息)。
  • AMS 通过 ActivityStack 来管理 Activity 的启动、暂停、恢复等操作。

任务栈管理流程

当一个 Activity 启动时,AMS 主要执行以下操作:

  1. 应用请求启动 Activity

    • 通过 startActivity(Intent) 发送启动请求。
    • ActivityTaskManagerService 处理该请求。
  2. 判断 launchMode

    • 如果是 standard,总是创建新实例。
    • 如果是 singleTop,检查栈顶 Activity 是否是相同实例,若相同则复用。
    • 如果是 singleTask,查找任务栈内是否已有实例,若有则复用并清除其上的 Activity
    • 如果是 singleInstance,则启动 Activity 并创建独立任务栈。
  3. 通知 TaskSupervisor 处理任务栈调整

    • 可能涉及 ActivityStack 切换、Activity 回收等操作。
  4. 最终交给 ActivityThread 处理 UI

    • AMS 通过 Binder 进程间通信(IPC)通知 ActivityThread 在目标 App 进程中创建 Activity 实例,并回调 onCreate()

示例分析

假设你启动了 MainActivitysingleTask):

val intent = Intent(this, MainActivity::class.java)
startActivity(intent)

如果任务栈中已有 MainActivity

  • AMS 发现 MainActivity 在栈中,调用 onNewIntent() 并清除它上面的 Activity

如果任务栈中没有 MainActivity

  • AMS 创建 MainActivity 实例,并将其加入任务栈。

总结

组件作用
ActivityManagerService (AMS)负责管理 Activity 生命周期、进程和任务栈
TaskSupervisor负责创建/销毁 Task,维护 Activity 之间的关系
ActivityStack代表一个 Task,存放 ActivityRecord
ActivityThread运行在 App 进程中,负责 Activity 的创建、UI 渲染

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词