ActivityThread和ApplicationThread,Android應(yīng)用程序的主線程與AMS通信的橋梁
ActivityThread
ActivityThread是Android系統(tǒng)中負(fù)責(zé)管理和調(diào)度應(yīng)用程序中Activity的一個(gè)重要組件。
本質(zhì)與功能:
- ActivityThread本質(zhì)上是一個(gè)線程,用于啟動(dòng)應(yīng)用程序以及進(jìn)程中進(jìn)行應(yīng)用程序的主循環(huán),可以理解為應(yīng)用程序的主線程或UI線程。
- 管理應(yīng)用進(jìn)程的主線程的執(zhí)行,根據(jù)AMS的要求(通過(guò)IApplicationThread接口,AMS為Client,ActivityThread.ApplicationThread為Server)負(fù)責(zé)調(diào)度和執(zhí)行activities、broadcasts和其他操作。
主要職責(zé):
- 處理Activity的生命周期:ActivityThread負(fù)責(zé)檢測(cè)并執(zhí)行每個(gè)Activity的生命周期方法,如onCreate()、onStart()、onPause等,根據(jù)生命周期狀態(tài)控制Activity的創(chuàng)建、啟動(dòng)、停止和銷毀等過(guò)程。
- 管理消息循環(huán):ActivityThread創(chuàng)建了一個(gè)消息循環(huán)機(jī)制,用于處理Activity中的消息和事件,根據(jù)優(yōu)先級(jí)來(lái)處理和分發(fā)消息。創(chuàng)建的消息包括用戶界面中的用戶事件、Intent和Broadcast請(qǐng)求等。
- 管理窗口和視圖:負(fù)責(zé)管理窗口的視圖的創(chuàng)建和顯示,以及與窗口和視圖相關(guān)的事件處理。
初始化過(guò)程:
- 在main()方法中,ActivityThread會(huì)初始化一些全局狀態(tài),例如創(chuàng)建一個(gè)Application對(duì)象和一個(gè)Instrumentation對(duì)象。
- ActivityThread會(huì)創(chuàng)建一個(gè)H(Handler)對(duì)象,并通過(guò)H對(duì)象創(chuàng)建一個(gè)消息循環(huán)(Looper)。
- ActivityThread會(huì)調(diào)用Instrumentation對(duì)象的callApplicationOnCreate()方法,通知App的Application對(duì)象進(jìn)行初始化,這也是App中的第一個(gè)回調(diào)函數(shù)。
- ActivityThread會(huì)調(diào)用ActivityClientRecord對(duì)象的execute()方法,開(kāi)始執(zhí)行啟動(dòng)Activity的相關(guān)操作。
- ActivityThread會(huì)依次調(diào)用Activity的生命周期方法,如onCreate()、onStart()、onResume()等。
成員變量和方法:
- ActivityThread類包含了許多重要的成員變量和方法,如mLooper(表示主線程使用的消息循環(huán))、mActivities(保存當(dāng)前活動(dòng)(Activity)對(duì)象的集合)、mH(Handler對(duì)象,處理消息隊(duì)列中的消息)和mInstrumentation(Instrumentation對(duì)象,用于執(zhí)行各種測(cè)試和測(cè)量操作)等。
主線程的主要責(zé)任:
- 在Android系統(tǒng)中,默認(rèn)情況下,一個(gè)應(yīng)用程序內(nèi)的各個(gè)組件(如Activity、BroadcastReceiver、Service)都會(huì)在同一個(gè)進(jìn)程里執(zhí)行,且由此進(jìn)程的主線程負(fù)責(zé)執(zhí)行。主線程的主要責(zé)任是快速處理UI事件。
ApplicationThread
ApplicationThread是ActivityThread的內(nèi)部類,是一個(gè)Binder對(duì)象。ApplicationThread作為IApplicationThread對(duì)象的server端,等待client端的請(qǐng)求然后進(jìn)行處理,其中最大的client就是AMS。
ApplicationThread在Android應(yīng)用程序啟動(dòng)過(guò)程中扮演著重要角色。當(dāng)ActivityThread的handleBindApplication方法被調(diào)用時(shí),會(huì)將ApplicationThread與Application對(duì)象進(jìn)行綁定,作為應(yīng)用程序與系統(tǒng)服務(wù)之間進(jìn)行通信的橋梁。handleBindApplication方法還會(huì)調(diào)用Application對(duì)象的onCreate方法,這是應(yīng)用程序啟動(dòng)過(guò)程中的第一個(gè)回調(diào)方法。
在Activity的啟動(dòng)邏輯過(guò)程中,ApplicationThread的ScheduleActivity方法會(huì)通過(guò)一個(gè)叫H的Handler發(fā)送一個(gè)啟動(dòng)Activity的信息。ActivityThread也就是我們常說(shuō)的UI線程或主線程,是程序的入口(main函數(shù)),保存了應(yīng)用中所有的對(duì)應(yīng)組件(如活動(dòng)、服務(wù)和內(nèi)容提供者等)。
創(chuàng)建根Activity:
圖片
Launcher進(jìn)程向AMS請(qǐng)求創(chuàng)建根Activity,AMS會(huì)判斷根Activity所需的應(yīng)用程序進(jìn)程是否存在并啟動(dòng),如果不存在請(qǐng)求Zygote進(jìn)程創(chuàng)建應(yīng)用程序進(jìn)程。應(yīng)用程序進(jìn)程啟動(dòng)后,AMS會(huì)請(qǐng)求應(yīng)用程序進(jìn)程創(chuàng)建并啟動(dòng)根Activity。
創(chuàng)建普通Activity:
圖片
在應(yīng)用程序進(jìn)程中的Activity向AMS請(qǐng)求創(chuàng)建普通Activity(步驟1),AMS會(huì)對(duì)這個(gè)Activty的生命周期管和棧進(jìn)行管理,校驗(yàn)(AndroidManifest.xml注冊(cè)文件聲明、啟動(dòng)權(quán)限)Activity等等。如果Activity滿足AMS的校驗(yàn),(判斷進(jìn)程存在)AMS就會(huì)請(qǐng)求應(yīng)用程序進(jìn)程中的ActivityThread去創(chuàng)建并啟動(dòng)普通Activity。
圖片
總結(jié)
ApplicationThread是ActivityThread的一個(gè)內(nèi)部類,實(shí)現(xiàn)了IApplicationThread 接口,是一個(gè)Binder接口,用于跨進(jìn)程通信(IPC)。ApplicationThread對(duì)象作為 IApplicationThread的服務(wù)端,被AMS等系統(tǒng)服務(wù)通過(guò)Binder機(jī)制進(jìn)行調(diào)用。
ActivityThread 是Android應(yīng)用程序進(jìn)程的主線程,也就是我們通常所說(shuō)的UI線程。每個(gè)Android應(yīng)用程序進(jìn)程都有一個(gè)ActivityThread實(shí)例,負(fù)責(zé)創(chuàng)建和管理應(yīng)用程序的組件(如Activity、Service、BroadcastReceiver等),并處理與這些組件相關(guān)的生命周期事件。
ApplicationThread和ActivityThread是緊密相關(guān)的。ApplicationThread是 ActivityThread 的一個(gè)內(nèi)部類,用于處理來(lái)自AMS的IPC調(diào)用,并將這些調(diào)用轉(zhuǎn)換為對(duì)ActivityThread中相應(yīng)方法的調(diào)用。AMS通過(guò)ApplicationThread與ActivityThread進(jìn)行通信,從而管理應(yīng)用程序的生命周期和組件。