ActivityThread
ActivityThread是Android系统中负责管理和调度应用程序中Activity的一个重要组件。
本质与功能:
- ActivityThread本质上是一个线程,用于启动应用程序以及进程中进行应用程序的主循环,可以理解为应用程序的主线程或UI线程。
- 管理应用进程的主线程的执行,根据AMS的要求(通过IApplicationThread接口,AMS为Client,ActivityThread.ApplicationThread为Server)负责调度和执行activities、broadcasts和其他操作。
主要职责:
- 处理Activity的生命周期:ActivityThread负责检测并执行每个Activity的生命周期方法,如onCreate()、onStart()、onPause等,根据生命周期状态控制Activity的创建、启动、停止和销毁等过程。
- 管理消息循环:ActivityThread创建了一个消息循环机制,用于处理Activity中的消息和事件,根据优先级来处理和分发消息。创建的消息包括用户界面中的用户事件、Intent和Broadcast请求等。
- 管理窗口和视图:负责管理窗口的视图的创建和显示,以及与窗口和视图相关的事件处理。
初始化过程:
- 在main()方法中,ActivityThread会初始化一些全局状态,例如创建一个Application对象和一个Instrumentation对象。
- ActivityThread会创建一个H(Handler)对象,并通过H对象创建一个消息循环(Looper)。
- ActivityThread会调用Instrumentation对象的callApplicationOnCreate()方法,通知App的Application对象进行初始化,这也是App中的第一个回调函数。
- ActivityThread会调用ActivityClientRecord对象的execute()方法,开始执行启动Activity的相关操作。
- ActivityThread会依次调用Activity的生命周期方法,如onCreate()、onStart()、onResume()等。
成员变量和方法:
- ActivityThread类包含了许多重要的成员变量和方法,如mLooper(表示主线程使用的消息循环)、mActivities(保存当前活动(Activity)对象的集合)、mH(Handler对象,处理消息队列中的消息)和mInstrumentation(Instrumentation对象,用于执行各种测试和测量操作)等。
主线程的主要责任:
- 在Android系统中,默认情况下,一个应用程序内的各个组件(如Activity、BroadcastReceiver、Service)都会在同一个进程里执行,且由此进程的主线程负责执行。主线程的主要责任是快速处理UI事件。
ApplicationThread
ApplicationThread是ActivityThread的内部类,是一个Binder对象。ApplicationThread作为IApplicationThread对象的server端,等待client端的请求然后进行处理,其中最大的client就是AMS。
ApplicationThread在Android应用程序启动过程中扮演着重要角色。当ActivityThread的handleBindApplication方法被调用时,会将ApplicationThread与Application对象进行绑定,作为应用程序与系统服务之间进行通信的桥梁。handleBindApplication方法还会调用Application对象的onCreate方法,这是应用程序启动过程中的第一个回调方法。
在Activity的启动逻辑过程中,ApplicationThread的ScheduleActivity方法会通过一个叫H的Handler发送一个启动Activity的信息。ActivityThread也就是我们常说的UI线程或主线程,是程序的入口(main函数),保存了应用中所有的对应组件(如活动、服务和内容提供者等)。
创建根Activity:
图片
Launcher进程向AMS请求创建根Activity,AMS会判断根Activity所需的应用程序进程是否存在并启动,如果不存在请求Zygote进程创建应用程序进程。应用程序进程启动后,AMS会请求应用程序进程创建并启动根Activity。
创建普通Activity:
图片
在应用程序进程中的Activity向AMS请求创建普通Activity(步骤1),AMS会对这个Activty的生命周期管和栈进行管理,校验(AndroidManifest.xml注册文件声明、启动权限)Activity等等。如果Activity满足AMS的校验,(判断进程存在)AMS就会请求应用程序进程中的ActivityThread去创建并启动普通Activity。
图片
总结
ApplicationThread是ActivityThread的一个内部类,实现了IApplicationThread 接口,是一个Binder接口,用于跨进程通信(IPC)。ApplicationThread对象作为 IApplicationThread的服务端,被AMS等系统服务通过Binder机制进行调用。
ActivityThread 是Android应用程序进程的主线程,也就是我们通常所说的UI线程。每个Android应用程序进程都有一个ActivityThread实例,负责创建和管理应用程序的组件(如Activity、Service、BroadcastReceiver等),并处理与这些组件相关的生命周期事件。
ApplicationThread和ActivityThread是紧密相关的。ApplicationThread是 ActivityThread 的一个内部类,用于处理来自AMS的IPC调用,并将这些调用转换为对ActivityThread中相应方法的调用。AMS通过ApplicationThread与ActivityThread进行通信,从而管理应用程序的生命周期和组件。