ActivityThread并不是Thread,只是一个工具类,不过这个类几乎完成了所有Android本地应用和AMS的交互逻辑,包括Application,Service,Activity和BroadcastReceiver的实例化,ContentProvider服务的获取,广播的接收,以及四大组件生命周期调度信息的分发。
Main
Android普通应用进程的起点就是ActivityThread的Main方法,在Main方法中,ActivityThread启动了一个主线程的消息队列,之后的操作都是通过消息队列进行消息分发来完成。
在attach方法中调用
将ApplicationThread(Binder)传递给AMS。
普通应用进程初始化Application在HandleBindApplication方法中,attach到AMS后, AMS便可以通过Binder调用HandleBindApplication方法然后创建Application,这一点和SystemServer进程不同。
注意本地进程提供了ApplicationThread类供AMS调用,ApplicationThread继承于ApplicationThreadNative,ApplicationThreadNative继承Binder并实现了IApplicationThread接口。IApplicationThread接口定义了可被调用的方法接口。
SystemMain
SystemServer进程调用,和Main方法不同的是,attach方法传了true,这这里实例化Application类,并回调onCreate方法。
Instrumentation也是在attach方法中进行初始化的,在Application创建之前。
要注意的一点是,这里并没有传递ApplicationThread给AMS,因为AMS就运行在SystemServer进程。SystemServer进程创建时,AMS等一系列服务还没有启动起来。SystemServer中运行的所有服务都是系统级别的,不受AMS等管控。这一点和普通进程有很大区别。
AMS
AMS提供给本地的Binder类可通过ActivityManagerNative.getDefault()获取,通过getDefault方法可以看到,AMS提供的Binder在本地进程通过一个单例维护:
AMS远程服务提供的接口定义在IActivityManager中。
ApplicationThread
实现了IApplicationThread的接口,本质上是一个Binder,AMS通过ApplicationThread的代理跨进程向本地进程发送消息。
H
H为继承于Handler,用于从ApplicationThread中接收并分发AMS发送过来的的消息到主线程。(因为Binder接收消息的线程不是主线程)
总结
AMS才是控制中心,所有的操作都是AMS决定,然后通过Binder发送到应用进程,ActivityThread收到消息然后分发