ActivityThread总结

ActivityThread并不是Thread,只是一个工具类,不过这个类几乎完成了所有Android本地应用和AMS的交互逻辑,包括Application,Service,Activity和BroadcastReceiver的实例化,ContentProvider服务的获取,广播的接收,以及四大组件生命周期调度信息的分发。

Main

Android普通应用进程的起点就是ActivityThread的Main方法,在Main方法中,ActivityThread启动了一个主线程的消息队列,之后的操作都是通过消息队列进行消息分发来完成。

在attach方法中调用

1
mgr.attachApplication(mAppThread);

将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在本地进程通过一个单例维护:

1
2
3
4
5
6
7
8
9
10
11
12
13
private static final Singleton<IActivityManager> gDefault = new Singleton<IActivityManager>() {
protected IActivityManager create() {
IBinder b = ServiceManager.getService("activity");
if (false) {
Log.v("ActivityManager", "default service binder = " + b);
}
IActivityManager am = asInterface(b);
if (false) {
Log.v("ActivityManager", "default service = " + am);
}
return am;
}
};

AMS远程服务提供的接口定义在IActivityManager中。

ApplicationThread

实现了IApplicationThread的接口,本质上是一个Binder,AMS通过ApplicationThread的代理跨进程向本地进程发送消息。

H

H为继承于Handler,用于从ApplicationThread中接收并分发AMS发送过来的的消息到主线程。(因为Binder接收消息的线程不是主线程)

总结

AMS才是控制中心,所有的操作都是AMS决定,然后通过Binder发送到应用进程,ActivityThread收到消息然后分发

文章目录
  1. 1. Main
  2. 2. SystemMain
  3. 3. AMS
  4. 4. ApplicationThread
  5. 5. H
  6. 6. 总结
|