外观
ActivityThread、ApplicationThread 和主线程是什么关系?
标准回答
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 通常共享主线程。
参考资料
内容来源
- Android 技术札记 · 原条目
framework-app-thread