Skip to content
阅读进度

ActivityThread、ApplicationThread 和主线程是什么关系? ​

返回 Framework 与系统服务 目录

标准回答 ​

ActivityThread 是应用进程中协调组件运行的重要框架对象。它组织应用绑定、Activity 等组件生命周期,以及主线程消息处理。名字里虽然有 Thread,但它本身不是 Thread 的子类;普通应用的入口会准备主 Looper 并进入消息循环。

ApplicationThread 是应用侧向系统暴露的 Binder 接口实现,可以理解为系统联系这个应用的入口。它也不是 Java 的 Application 对象,更不是单独的一条“Application 线程”。系统可以通过它安排组件相关工作,应用再把需要在主线程执行的操作交给相应调度路径。

例如系统要求创建一个页面,跨进程请求先进入应用侧 Binder 接口,生命周期事务等工作再由主线程调度执行,最终调用 Activity 的 onCreate、onStart 等方法。不是所有 ApplicationThread 方法都机械经过完全相同的投递流程,具体以版本实现为准;关键是区分远程请求的接收线程和业务实际执行线程。

主线程的 Looper 逐个处理已安排的工作。页面生命周期、输入处理和 View 更新都可能争用这条线程,所以一个耗时回调会推迟后续工作。Service 虽然没有界面,其常见生命周期回调默认也在主线程,不会因为名字叫 Service 就自动变成后台执行。

关键机制 ​

  • ActivityThread:应用侧运行协调对象;主线程:实际执行许多组件和 UI 工作的线程。
  • ApplicationThread:应用暴露给系统的 Binder 接口实现;Application:应用对象。
  • Binder 接收、消息调度和生命周期执行是不同阶段,分别观察耗时。

通俗例子 ​

系统已经把启动页面的任务交给应用,但主线程正在执行一个耗时初始化。新页面的 onCreate 仍要等待,不能仅凭“系统已发通知”就排除应用主线程阻塞。

追问与回答 ​

AMS 是怎样调用应用的 onCreate 的? ​

严格说是系统通过应用提供的 Binder 接口安排组件启动,应用框架再在合适的调度路径中执行生命周期。Activity 的 onCreate 通常发生在应用主线程,系统并不跨进程直接调用一个 Java Activity 对象的方法。Binder 传的是协议请求和参数,不是把普通对象方法调用原封不动跨进程执行。

A 跳到 B 后,A 开的后台线程还会执行吗? ​

如果进程仍存活,且你没有取消任务,普通后台线程不会因为 A 进入 onStop 就自动停止。是否停止取决于任务的归属和取消机制。我会让只服务 A 页面的任务跟随页面生命周期结束;确实需要跨页面继续的任务放在合适的业务作用域,并避免一直持有 A。

易混淆点 ​

ActivityThread、ApplicationThread 都不是“每个 Activity 各有一条线程”的意思。同一进程中的多个普通 Activity 通常共享主线程。

参考资料 ​

内容来源 ​

用完整回答理解机制,用真实证据解释项目。