AMS 是什么,和 activity 的关系

可以把 AMS(ActivityManagerService)ActivityThread 理解成 Android 应用启动与四大组件调度中的两端:

AMS 是系统进程里的“管理者”
ActivityThread 是应用进程里的“执行者”


1. AMS 是什么?

AMS,全称 ActivityManagerService,运行在 system_server 进程 中。

它是 Android 系统中负责管理应用组件生命周期的核心服务之一,主要管理:

  • Activity 的启动、暂停、恢复、销毁
  • Service 的启动、绑定、停止
  • Broadcast 的分发
  • ContentProvider 的管理
  • 进程的启动与回收
  • 任务栈、Activity 栈管理
  • 应用 ANR 监控

可以简单理解为:

AMS 负责“决定谁该启动、谁该停止、谁在前台、谁在后台”。


2. ActivityThread 是什么?

ActivityThread 运行在 应用进程 中。

虽然名字叫 ActivityThread,但它并不是只负责 Activity,也不是一个 Thread 类,而是应用进程的主入口和核心调度类。

它主要负责:

  • 创建 Application
  • 创建 Activity
  • 调用 Activity 生命周期方法
  • 创建 Service
  • 分发 BroadcastReceiver
  • 安装 ContentProvider
  • 管理主线程消息循环

应用进程启动后,会执行:

ActivityThread.main()

在里面创建主线程 Looper,然后进入消息循环。

可以简单理解为:

ActivityThread 负责在应用进程中真正执行组件生命周期。


3. AMS 和 ActivityThread 的关系

AMS 和 ActivityThread 分别运行在不同进程中:

角色 所在进程 作用
AMS system_server 进程 系统级管理者
ActivityThread 应用进程 应用内执行者

它们通过 Binder IPC 通信。


4. 举例:启动一个 Activity 的过程

假设你调用:

startActivity(intent)

大致流程是:

第一步:应用请求 AMS

当前应用通过 Binder 调用 AMS:

App 进程 → AMS

AMS 会检查:

  • Intent 是否合法
  • 目标 Activity 是否存在
  • 权限是否满足
  • 是否需要新建任务栈
  • 目标进程是否已经存在

第二步:AMS 判断目标进程是否存在

如果目标 Activity 所在的进程还没启动,AMS 会请求 Zygote fork 一个新进程。

AMS → Zygote → fork 新 App 进程

新进程启动后,入口是:

ActivityThread.main()

第三步:ActivityThread 绑定到 AMS

应用进程启动后,ActivityThread 会通过 Binder 向 AMS 报到:

ActivityThread → AMS:我启动好了

这个过程叫做 attach

AMS 知道应用进程已经启动,就可以继续调度组件了。


第四步:AMS 通知 ActivityThread 创建 Activity

AMS 通过 Binder 通知应用进程里的 ActivityThread:

AMS → ActivityThread:创建并启动这个 Activity

ActivityThread 收到消息后,会在主线程中执行:

performLaunchActivity()

然后完成:

Activity activity = new Activity();
activity.attach(...);
activity.onCreate(...);
activity.onStart(...);
activity.onResume(...);

最终 Activity 显示出来。


5. 它们的通信方式

AMS 和 ActivityThread 之间是双向 Binder 通信。

应用调用 AMS

应用侧通过类似下面的接口调用系统服务:

IActivityManager

例如:

ActivityThread / ContextImpl → AMS

用于请求启动 Activity、Service 等。


AMS 调用应用进程

AMS 通过应用进程暴露给它的 Binder 接口调用回来:

IApplicationThread

这个接口的实现通常在:

ActivityThread.ApplicationThread

也就是说:

AMS → ApplicationThread → ActivityThread Handler → 主线程执行生命周期

注意:
AMS 直接 Binder 调用到应用进程时,不会直接执行 Activity 生命周期,而是通过 Handler 切到应用主线程执行。


6. 为什么需要 AMS 和 ActivityThread 分开?

因为 Android 是多进程系统:

  • 系统必须统一管理所有应用
  • 每个应用运行在自己的独立进程
  • 系统进程不能直接调用应用对象
  • 应用进程也不能自己随意启动组件

所以需要:

AMS 统一管理
ActivityThread 本地执行
Binder 负责跨进程通信

7. 一个形象比喻

可以把 Android 系统想象成一个剧场:

对象 比喻
AMS 导演 / 调度中心
ActivityThread 演员所在剧组的执行负责人
Activity 演员
Binder 对讲机
Zygote 造人机器 / 进程孵化器

AMS 说:

这个 Activity 该上场了。

ActivityThread 收到指令后,在应用进程中真正执行:

onCreate()
onStart()
onResume()

8. 总结一句话

AMS 是 system_server 中负责管理应用组件和进程的系统服务;ActivityThread 是应用进程中的主线程调度核心,负责根据 AMS 的指令真正创建组件并执行生命周期。

更简单地说:

AMS 管“什么时候做”,ActivityThread 管“具体怎么做”。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇