ActivityThread 是 Android 框架中的一个核心类,负责管理应用程序的主线程(UI 线程)以及应用程序的生命周期事件。了解它的工作原理对于理解 Android 应用程序的运行机制是非常有帮助的。
主要职责
- 管理主线程:ActivityThread 是应用程序的主线程,负责处理所有的 UI 操作。
- 生命周期管理:处理 Activity、Service、BroadcastReceiver 等组件的生命周期事件。
- 消息循环:使用 Looper 和 Handler 来管理主线程的消息队列,处理来自系统和应用程序的各种消息。
- 资源加载:负责加载应用程序的资源(如布局文件、图片等)。
- 应用程序组件的创建和销毁:管理应用程序组件的创建、启动、暂停、恢复和销毁。
关键组件
- Main:ActivityThread 的入口方法是 main 方法,它负责初始化应用程序的主线程,并启动消息循环。
- Handler:ActivityThread 内部使用一个 Handler 来处理来自 AMS 的消息,并执行相应的组件生命周期方法。
- ApplicationThread: 是一个内部类,它实现了 IApplicationThread 接口,用于与 AMS 进行通信
工作流程
- 启动应用程序:
- 当用户启动一个应用程序时,Android 系统(Zygote进程)会创建一个新的进程,并在该进程中启动ActivityThread。
- ActivityThread 的 main 方法是应用程序的入口点,它会初始化 Looper 和消息队列,然后进入消息循环。
- 处理消息:
- ActivityThread 使用 Handler 来处理消息,这些消息可以来自系统(如生命周期事件)或应用程序(如用户交互事件)。
- 每当有消息到达时,Handler 的 handleMessage 方法会被调用,ActivityThread 会根据消息的类型进行相应的处理。
- 管理生命周期:
- ActivityThread 负责管理 Activity 的生命周期事件,如 onCreate、onStart、onResume、onPause、onStop 和 onDestroy。
- 当系统需要启动或销毁一个 Activity 时,会向 ActivityThread 发送相应的消息,ActivityThread 会调用对应的生命周期方法。
基本工作流程
public class ActivityThread {
public static void main(String[] args) {
// 初始化主线程的 Looper
Looper.prepareMainLooper();
// 创建 ActivityThread 实例
ActivityThread thread = new ActivityThread();
thread.attach(false);
// 进入消息循环
Looper.loop();
}
private void attach(boolean system) {
// 初始化应用程序
AppBindData data = new AppBindData();
data.appInfo = new ApplicationInfo();
// 其他初始化操作
// 创建应用程序实例
Application app = new Application();
app.onCreate();
// 启动第一个 Activity
Instrumentation instrumentation = new Instrumentation();
Activity activity = instrumentation.newActivity(Activity.class, null);
activity.onCreate(null);
}
private class H extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case LAUNCH_ACTIVITY:
// 启动 Activity
handleLaunchActivity((ActivityClientRecord) msg.obj);
break;
// 处理其他消息
}
}
}
private void handleLaunchActivity(ActivityClientRecord r) {
Activity activity = r.activity;
activity.onStart();
activity.onResume();
}
private static class AppBindData {
ApplicationInfo appInfo;
}
private static class ActivityClientRecord {
Activity activity;
}
}