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

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

责任编辑:武晓燕 来源: 沐雨花飞蝶
相关推荐

2012-05-16 13:19:38

SAP移动应用移动办公

2011-11-03 09:41:35

Android签名安全性

2011-12-23 10:25:11

Android音乐编程控制音量

2011-05-24 16:09:57

Androi

2010-03-03 16:45:46

Android应用程序

2012-04-25 22:56:10

Android

2014-09-28 11:28:02

Android应用程序生命周期

2010-12-15 09:51:42

Android程序界面iPhone程序界面设

2020-08-25 14:03:20

应用程序屏蔽应用程序内保护网络攻击

2022-09-27 15:16:42

开发Android应用程序

2009-10-09 17:01:32

VB.NET多线程

2010-08-12 16:20:57

Flex应用程序

2011-04-15 17:33:39

SWINGAWT

2010-09-06 14:33:46

AndroidJava

2014-05-27 15:09:13

AndroidActivitysingleTask

2014-05-27 15:04:15

AndroidActivitysingleTask

2014-05-27 14:33:37

AndroidActivitysingleTask

2010-02-06 16:02:57

Android 应用程

2011-03-18 13:30:18

Android办公

2014-05-27 14:59:24

AndroidActivitysingleTask
点赞
收藏

51CTO技术栈公众号