Android中ApplicationThread和AcitivityThread的区别

113 阅读3分钟

来直接讲讲Android中 ApplicationThreadActivityThread 的核心区别。

简单来说,它们是同一个对象的不同视角ActivityThread 是我们通常所说的主线程,是应用程序的实际运行体;而 ApplicationThread 是一个 Binder 接口,作为 ActivityThread 在系统服务(特别是 ActivityManagerService)中的一个代理。

下面我们来详细拆解一下。

## 核心区别:一个在本地,一个在远方(系统服务)

想象一下这个场景:你的 App 需要和系统的“大总管”—— ActivityManagerService (AMS) 对话,比如启动一个 Activity 或者停止一个 Service。但是,AMS 运行在一个独立的系统进程中,你的 App 无法直接调用它。这时就需要一个跨进程通信(IPC)的机制,也就是 Binder

  • ActivityThread: 这是你 App 的真正主线程。它包含了 main() 方法,是所有四大组件(Activity, Service, BroadcastReceiver, ContentProvider)运行的地方。它在你的 App 进程内部实实在在地干活,比如处理 UI 事件、执行生命周期回调等。你可以把它看作是 App 进程的“本地执行者”
  • ApplicationThread: 这是一个 Binder 服务端接口IApplicationThread.Stub 的实现),它也运行在你的 App 进程中,并且是 ActivityThread 的一个内部类。它的作用是接收来自系统进程(主要是 AMS)的指令。当 AMS 需要通知你的 App 去执行某个操作时(例如,“嘿,启动你的 MainActivity!”),它会通过这个 ApplicationThread 的 Binder 接口发送指令。你可以把它看作是 AMS 在你 App 进程里的“远程代理”或“信使”

所以,整个流程是这样的:

  1. App -> AMS: 你的 App(例如在 ActivityThread 中)通过 Binder IPC 调用远在系统进程的 AMS,请求执行操作(比如 startActivity)。
  2. AMS -> App: AMS 处理完请求后,需要回调你的 App,告诉它具体要做什么(比如创建并运行 Activity)。这时,AMS 就会通过它持有的 ApplicationThread 的 Binder 代理,将指令发送回你的 App 进程。
  3. App 内部: ApplicationThread 接收到指令后,并不会自己执行,而是把它交给 ActivityThread 的 Handler(mH),切换到主线程中去执行真正的操作(比如调用 handleLaunchActivity)。

## 总结对比

特性ActivityThreadApplicationThread
本质一个具体的,应用的实际主线程。一个 Binder 接口的实现,是 ActivityThread 的内部类。
作用执行者:管理和执行应用主线程的所有操作,如生命周期回调、UI绘制等。接收者/信使:作为 Binder 服务端,接收来自 AMS 的远程指令。
交互方向App -> 系统 (通过 AMS 的代理)系统 (AMS) -> App (通过 Binder 通信)
可见性主要在 App 进程内部活动。作为 App 在 AMS 中的代理而存在。

Export to Sheets

总而言之,ActivityThread 是你应用的实际主线程,负责所有本地工作。ApplicationThread 是这个主线程的通信接口,专门用来接收来自系统服务(AMS)的跨进程指令。它们共同协作,完成了应用与系统之间的双向通信。

profile picture

Generate Audio Overview

Video

Deep Research

Canvas

Gemini can make mistakes, so double-check it