7

ActivityThread和ApplicationThread,Android应用程序的主线程与AMS通信的桥梁

 2 months ago
source link: https://www.51cto.com/article/788723.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

ActivityThread和ApplicationThread,Android应用程序的主线程与AMS通信的桥梁

作者:Reathin 2024-05-20 08:21:36
ApplicationThread是ActivityThread​的一个内部类,实现了IApplicationThread​ 接口,是一个Binder接口,用于跨进程通信(IPC)。ApplicationThread​对象作为 IApplicationThread的服务端,被AMS等系统服务通过Binder机制进行调用。

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进行通信,从而管理应用程序的生命周期和组件。

责任编辑:武晓燕 来源: 沐雨花飞蝶

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK