簡(jiǎn)介:
在android系統(tǒng)中,Home界面也就是Launcher的界面,Launcher它本身也是一個(gè)應(yīng)用程序,在其它程序安裝完成以后,會(huì)在Launcher中出現(xiàn)一個(gè)圖標(biāo),點(diǎn)擊該圖標(biāo),對(duì)應(yīng)該圖標(biāo)的應(yīng)用程序也就會(huì)啟動(dòng)起來(lái)。
在說(shuō)明整個(gè)啟動(dòng)流程之前,我們首先需要了解幾個(gè)用到的主要類(lèi):
1. ? Launcher類(lèi)
Launcher俗稱(chēng)HomeScreen,也就是我們啟動(dòng)Android手機(jī),第一眼看到的就是這個(gè)應(yīng)用程序,而這個(gè)應(yīng)用程序是比較特殊而且任務(wù)艱巨的。它負(fù)責(zé)了我們除了應(yīng)用本身操作以外的所有操作,它負(fù)責(zé)了我們有幾個(gè)桌面,點(diǎn)擊應(yīng)用圖標(biāo)啟動(dòng)應(yīng)用程序,長(zhǎng)時(shí)間按桌面出現(xiàn)上下文菜單,長(zhǎng)時(shí)間按桌面的圖標(biāo)出現(xiàn)垃圾箱,拖動(dòng)應(yīng)用圖標(biāo)重新定位等等,一系列的操作。
2.? Intrumentation類(lèi)
官方的解釋為:
/** Base class for implementing application instrumentation code. ?When running
* with instrumentation turned on, this class will be instantiated for you
* before any of the application code, allowing you to monitor all of the
* interaction the system has with the application. ?An Instrumentation
* implementation is described to the system through an AndroidManifest.xml's
* <instrumentation> tag.*/
大意為:Instrumentation類(lèi)會(huì)在應(yīng)用的任何代碼執(zhí)行前被實(shí)列化,用來(lái)監(jiān)控系統(tǒng)與應(yīng)用的交互。
在本文介紹的啟動(dòng)流程當(dāng)中,Instrumentation則搭建起了從Launcher到ActivityManagerNative橋梁,從ActivityManagerNative作為起始點(diǎn),開(kāi)啟了整個(gè)App啟動(dòng)的流程。
3.? ActivityManagerNative類(lèi)
ActivityManager的功能是與系統(tǒng)中所有運(yùn)行著的Activity交互提供了接口,主要的接口圍繞著運(yùn)行中的進(jìn)程信息,任務(wù)信息,服務(wù)信息等。而在后續(xù)的介紹中,會(huì)談到ActivityManager到ActivityManagerService之間的交互,它們二者交互中會(huì)經(jīng)過(guò)一個(gè)環(huán)節(jié),那就是進(jìn)程通信,而IActivityManager以及實(shí)現(xiàn)接口的代理類(lèi)ActivityManagerProxy,存根類(lèi)ActivityManagerNative起著負(fù)責(zé)進(jìn)程通信的作用,雖然這里沒(méi)有使用aidl文件定義進(jìn)程通信接口IActivityManager,其實(shí)是一樣的,我們可以把它看做是自己手動(dòng)編譯的aidl進(jìn)程通信java類(lèi)實(shí)現(xiàn),ActivityManagerProxy是代理類(lèi),ActivityManagerNative是Stub類(lèi),IActivityManager是aidl接口。
4. ? ActivityStack類(lèi)
正如其名,ActivityStack是一個(gè)用于管理Activity棧結(jié)構(gòu)的類(lèi),下面有對(duì)棧結(jié)構(gòu)的簡(jiǎn)單介紹:
Activity承擔(dān)了大量的顯示和交互工作,從某種角度上將,我們看見(jiàn)的應(yīng)用程序就是許多個(gè)Activity的組合。為了讓這許多 Activity協(xié)同工作而不至于產(chǎn)生混亂,Android平臺(tái)設(shè)計(jì)了一種堆棧機(jī)制用于管理Activity,其遵循先進(jìn)后出的原則,系統(tǒng)總是顯示位于棧 頂?shù)腁ctivity,從邏輯上將,位于棧頂?shù)腁ctivity也就是最后打開(kāi)的Activity,這也是符合邏輯的。
在操作應(yīng)用程序時(shí),每次啟動(dòng)新的Activity,都會(huì)將此壓入Activity Stack,當(dāng)用戶(hù)執(zhí)行返回操作時(shí),移除Activity Stack頂上的Activity,這樣就實(shí)現(xiàn)了返回上一個(gè)Activty的功能。直到用戶(hù)一直返回到Home Screen,這時(shí)候可以理解為移除了Activity Stack所有的Activity,這個(gè)Activity Stack不再存在,應(yīng)用程序也結(jié)束了運(yùn)行。
5. ? ActivityThread類(lèi)
它管理應(yīng)用進(jìn)程的主線程的執(zhí)行(相當(dāng)于普通Java程序的main入口函數(shù)),并根據(jù)AMS的要求(通過(guò)IApplicationThread接口,AMS為Client、ActivityThread.ApplicationThread為Server)負(fù)責(zé)調(diào)度和執(zhí)行activities、broadcasts和其它操作。
6. ? ActivityApplication類(lèi)
該類(lèi)在其它博客和論壇上有很詳細(xì)的說(shuō)明,這里我們引入一些比較簡(jiǎn)單明了的解釋?zhuān)?/p>
Application和Activity,Service一樣是android框架的一個(gè)系統(tǒng)組件,當(dāng)android程序啟動(dòng)時(shí)系統(tǒng)會(huì)創(chuàng)建一個(gè) application對(duì)象,用來(lái)存儲(chǔ)系統(tǒng)的一些信息。通常我們是不需要指定一個(gè)Application的,這時(shí)系統(tǒng)會(huì)自動(dòng)幫我們創(chuàng)建,如果需要?jiǎng)?chuàng)建自己 的Application,也很簡(jiǎn)單創(chuàng)建一個(gè)類(lèi)繼承 Application并在manifest的application標(biāo)簽中進(jìn)行注冊(cè)(只需要給Application標(biāo)簽增加個(gè)name屬性把自己的 Application的名字定入即可)。
android系統(tǒng)會(huì)為每個(gè)程序運(yùn)行時(shí)創(chuàng)建一個(gè)Application類(lèi)的對(duì)象且僅創(chuàng)建一個(gè),所以Application可以說(shuō)是單例 (singleton)模式的一個(gè)類(lèi).且application對(duì)象的生命周期是整個(gè)程序中最長(zhǎng)的,它的生命周期就等于這個(gè)程序的生命周期。因?yàn)樗侨?的單例的,所以在不同的Activity,Service中獲得的對(duì)象都是同一個(gè)對(duì)象。所以通過(guò)Application來(lái)進(jìn)行一些,數(shù)據(jù)傳遞,數(shù)據(jù)共享 等,數(shù)據(jù)緩存等操作。
7. ? ActivityManagerService類(lèi)
ActivityManagerService是非常值得深入學(xué)習(xí)的,這里只籠統(tǒng)的說(shuō)明一下他的功能:
ActivityManagerService是Android中最核心的服務(wù),主要負(fù)責(zé)系統(tǒng)中四大組件的啟動(dòng)、切換、調(diào)度及應(yīng)用進(jìn)程的管理和調(diào)度等工作,其職責(zé)與操作系統(tǒng)中的進(jìn)程管理和調(diào)度模塊相類(lèi)似,因此它在Android中非常重要。
額外補(bǔ)充:
除上面提到的信息以外,還需要對(duì)Android系統(tǒng)進(jìn)程間通訊Binder機(jī)制有一定的了解,由于本文中只介紹app的啟動(dòng)流程,對(duì)于Binder機(jī)制,這里就從網(wǎng)上找了一些基本嘻嘻,進(jìn)行簡(jiǎn)單說(shuō)明一下:
Android系統(tǒng)存了Zygote進(jìn)程和SystemServer進(jìn)程以及各種應(yīng)用進(jìn)程等,為了能夠?qū)崿F(xiàn)各種進(jìn)程之間的通訊,Android系統(tǒng)采用了自己的進(jìn)程間通訊方式Binder機(jī)制。其中主要涉及到了四種角色:Binder Client,Binder Server,Binder Manager, Binder driver。各種角色之間的關(guān)系可以參考下面這張圖的介紹:
流程及源碼:
下面我們?cè)敿?xì)介紹一下點(diǎn)擊后,整個(gè)源碼的運(yùn)行流程:
1.Launcher:
1.a ?位于packages/apps/Launcher2目錄。
1.b ?源碼部分:
在點(diǎn)擊了Launcher界面中的App的圖標(biāo)以后,會(huì)執(zhí)行其中的onClick方法,其中intent為我們?cè)贏ndroidManifest.xml文件中配置的信息:
同時(shí),從代碼中可以發(fā)現(xiàn)其中最終調(diào)用了startActivitySafely方法:
可以發(fā)現(xiàn)內(nèi)部則又調(diào)用了startActivity方法,但是我們?cè)贚auncher類(lèi)中沒(méi)有發(fā)現(xiàn)有該方法,由 于Launcher類(lèi)為Activity類(lèi)的子類(lèi),我們可以在其父類(lèi)中進(jìn)行查找,發(fā)現(xiàn)其中有我們正在查找的方法:
它本身由調(diào)用了startActivityForResult進(jìn)行處理,其中傳入的參數(shù)-1代表結(jié)束后,不需要這個(gè)Activity的結(jié)果,讓我們?cè)賮?lái)看這個(gè)startActivityForResult:
可以發(fā)現(xiàn),在startActivityForResult方法內(nèi)部,又調(diào)用了Intrumentation類(lèi)的對(duì)象中的execStartActivity方法,執(zhí)行時(shí),傳入了相應(yīng)的參數(shù),其中:
A. mMainThread:為Activity成員變量,類(lèi)型Activity Thread,它代表的是應(yīng)用程序的主線程。
B. mMainThread.getApplicationThread():則是為了獲取其內(nèi)部的Application Thread內(nèi)部類(lèi),在隨后的流程中,它作為一個(gè)Binder對(duì)象,扮演了一個(gè)鏈接通訊的角色,ActivityManagerService會(huì)使用它來(lái)和ActivityThread來(lái)進(jìn)行進(jìn)程間通信。
C. mToken:為一個(gè)Binder對(duì)象的遠(yuǎn)程接口。
2. ?Instrumentation.execStartActivity
2.a ?作用:
它用來(lái)監(jiān)控應(yīng)用程序和系統(tǒng)的交互。
2.b ?位置:
package android.app(1492行)
2.c ?源碼:
由于在上面中調(diào)用到了Instrumentation中的execStartActivity方法,我們直接來(lái)看該方法內(nèi)部的源碼:
在方法中可以看到,與startActivity相關(guān)的方法是:ActivityManagerNative.getDefault.startActivity方法,其中:
ActivityManagerNative.getDefault返回是ActivityManagerService的遠(yuǎn)程接口,即為ActivityManagerProxy的接口,通過(guò)該接口調(diào)用startActivity方法,在參數(shù)中可以發(fā)現(xiàn),傳入了intent.resolveTypeIfNeeded這個(gè)參數(shù),實(shí)則為AndroidMainfest.xml中的設(shè)置的MIME類(lèi)型,從上面配置的信息中,我們可以知道intent并沒(méi)有配置MIME類(lèi)型,因此在此返回null,不用做考慮。
3. ?ActivityManagerProxy.startActivity
3.a ?作用:
提供IActivityManager,根據(jù)參數(shù),執(zhí)行接口中提供的對(duì)應(yīng)方法。
3.b ?位置:
ActivityManagerNative中的內(nèi)部類(lèi)(3044行)
3.c ?源碼:
在ActivityManagerProxy的startActivity方法中,可以看見(jiàn)對(duì)傳入的參數(shù)及信息封裝到一個(gè)Parcel類(lèi)型的Data包內(nèi),在封裝完成后,執(zhí)行了IBinder類(lèi)型mRemote變量中的transact方法,其中傳入的對(duì)應(yīng)startActivity行為的參數(shù)START_ACTIVITY_TRANSACTION。
4. ?ActivityManagerService.startActivity
4.a ?作用:
在經(jīng)過(guò)上面的mRemote變量的transact方法執(zhí)行以后,最終會(huì)通過(guò)Binder機(jī)制,進(jìn)入到ActivityManagerService當(dāng)中,執(zhí)行startActivity方法。
4.b ?位置:
android.server.am目錄下
4.c ?源碼:
位置(4282行)
執(zhí)行的內(nèi)容:
最終是將操作交給了mActivityStarter中的startActivityMayWait去執(zhí)行。
5. ?ActivityStarter.startActivityMayWait
5.a ?作用:
對(duì)intent中傳來(lái)的信息進(jìn)行封裝,同時(shí)調(diào)用startActivityLocked進(jìn)行下一步操作。
5.b ?位置:
android.server.am目錄下
5.c ?源碼:
位置:(675行)
在startActivityMayWait方法中,與啟動(dòng)相關(guān)的內(nèi)容主要有:
這部分內(nèi)容,除了在新的intent中封裝好即將啟動(dòng)的應(yīng)用程序信息內(nèi)容以外,同時(shí),調(diào)用resolveIntent方法,負(fù)責(zé)將intent中的內(nèi)容給解析出來(lái),得到MainActivity的相關(guān)信息,保存在ainfo變量當(dāng)中。
在最后的時(shí)候,調(diào)用startActivityLocked(819行)方法去進(jìn)一步處理。
6. ?ActivityStarter.startActivityLocked
6.a ?作用:
接收并保存調(diào)用者的進(jìn)程信息,并調(diào)用startActivityUncheckedLocked去進(jìn)行下一步操作
6.b ?位置:
android.server.am目錄下
6.c ?源碼:
位置:(224行)
startActivityLocked方法中內(nèi)部會(huì)將調(diào)用該方法的進(jìn)程對(duì)象,即caller的進(jìn)程信息(Launch),保存在callerApp當(dāng)中,用于下面的ActivityRecord記錄用。
同時(shí),作為L(zhǎng)auncher這個(gè)Activity里面的一個(gè)Binder對(duì)象,它可以獲得LauncherActivity的相關(guān)信息,同時(shí)也被該方法的sourceRecord變量記錄了下來(lái)。
隨后,所有即將用到的進(jìn)程信息會(huì)被傳入創(chuàng)建的ActivityRecord類(lèi)型對(duì)象r(493行)當(dāng)中。
最后調(diào)用startActivityUnchecked(535行)方法將r對(duì)象,sourceRecord等參數(shù)傳入該方法中。
7 ?ActivityStack.startActivityUnchecked等方法
7.a ?作用:
判斷即將啟動(dòng)的Activity是否需要在新的task中進(jìn)行創(chuàng)建和創(chuàng)建新的Task
7.b ?位置:(959行)
在執(zhí)行時(shí),會(huì)調(diào)用getReusableIntentActivity方法去看當(dāng)前有沒(méi)有Task可以用來(lái)執(zhí)行這個(gè)Activity。
在該方法中,由于沒(méi)有在AndroidMainfest.xml中設(shè)置launchmode,因此默認(rèn)情況下為0,即standard的情況。因此在檢查時(shí)候,會(huì)執(zhí)行對(duì)應(yīng)條件中的findTaskLocked方法,由于這個(gè)Activity當(dāng)前都沒(méi)有創(chuàng)建過(guò),因此,必然返回為null值。
因此,會(huì)調(diào)用上面的setTaskFromReuseOrCreateNewTask(1091行)方法,進(jìn)行Task的創(chuàng)建。該方法中會(huì)將新建Task,并將新建的Task添加進(jìn)TaskRecord當(dāng)中做記錄。
最后會(huì)調(diào)用ActivityStack類(lèi)型的變量mTargetStack的startActivityLocked來(lái)進(jìn)行進(jìn)一步處理。
8 ?ActivityStack.startActivityLocked
8.a作用:
確保當(dāng)前要開(kāi)啟的activity添加到新建的task的頂端。
8.b位置:(2636行)
8.c源碼:
調(diào)用了addActivityToTop確保即將開(kāi)啟的Activity被添加到Task的頂部。隨后調(diào)用resumeTopActivityInnerLocked(2113行)方法。
9 ?ActivityStack.resumeTopActivityInnerLocked
9.a ?作用:
將位于當(dāng)前正在運(yùn)行的LaunchActivity由Resumed狀態(tài)轉(zhuǎn)換為Paused狀態(tài)
9.b ?位置:(2113行)
9.c ?源碼:
將棧頂?shù)腁ctivity取出來(lái),這里的棧頂?shù)腁ctivity,就是剛剛添加到棧頂MainActivity,這時(shí)候取出來(lái)保存到next變量中。
與當(dāng)前Activity相關(guān)的,則還包括上面的判斷,mLastPausedActivity會(huì)將棧頂Activity轉(zhuǎn)換為休眠狀態(tài)時(shí)賦值給自己,而我們當(dāng)前的LaunchActivity由于仍處于Resumed狀態(tài),因此跳過(guò)本判斷,繼續(xù)往下進(jìn)行。
這時(shí),由于當(dāng)前正在處于Resumed狀態(tài)下的Activity是LaunchActivity,則此時(shí),就會(huì)走該判斷邏輯中的startPausingLocked(2252行)方法,將LaunchActivity推送到Paused狀態(tài)。
10 ?ActivityStack.startPausingLocked
10.a ?作用
將當(dāng)前處于Resumed狀態(tài)的Activity轉(zhuǎn)換為Paused狀態(tài)
10.b ?位置:(1076行)
10.c ?源碼:
當(dāng)前的LaunchActivity會(huì)作為參數(shù)賦值給prev變量。
在隨后的邏輯判斷中,由于LaunchActivity是在Zygote創(chuàng)建的時(shí)候,其app及thread就被創(chuàng)建完成了,因此必然不為null,prev.app.thread為通過(guò)它來(lái)通知Launcher這個(gè)Activity它要進(jìn)入Paused狀態(tài)了。當(dāng)然,這里的prev.app.thread是一個(gè)ApplicationThread對(duì)象的遠(yuǎn)程接口,通過(guò)調(diào)用這個(gè)遠(yuǎn)程接口的schedulePauseActivity來(lái)通知Launcher進(jìn)入Paused狀態(tài)。
這時(shí)就會(huì)調(diào)用ApplicationThreadProxy,該代理類(lèi)中的schedulePauseActivity方法。
11 ?ApplicationThreadProxy.schedulePauseActivity
11.a ?作用:
通過(guò)Binder進(jìn)程間通信的機(jī)制,進(jìn)入到ApplicationThread.schedulePauseActivity(657)方法當(dāng)中。
11.b ?位置:(775行)
11.c ?源碼:
該初就是將LaunchActivity的相關(guān)信息存入Parcel類(lèi)型的data變量當(dāng)中。最終通過(guò)Binder類(lèi)型的mRemote對(duì)象運(yùn)用進(jìn)程間通訊的機(jī)制,調(diào)用ActivityThread.schedulePauseActivity。
12 ?ActivityThread.schedulePauseActivity
12.a ?作用:
發(fā)送將LaunchActivity轉(zhuǎn)換為Paused狀態(tài)的信息。
12.b ?位置:(657行)
12.c ?源碼:
這里finished參數(shù)代表的是傳入的參數(shù)為prev對(duì)象所代表的Activity是否正在等待結(jié)束的Activity列表中,當(dāng)前LaunchActivity當(dāng)然不在這個(gè)隊(duì)列中,還在Resumed的情況下呢。因此必然為PAUSE_ACTIVITY傳參,這時(shí)就可以將信息發(fā)送出去了。
13 ?ActivityThread.handleMessage.handlePauseActivity
13.a ?作用:
接收并處理發(fā)送來(lái)的信息請(qǐng)求
13.b ?位置:(1469行)
13.c ?源碼:
根據(jù)msg傳入的what信息,在handleMessage找到對(duì)應(yīng)的PAUSE_ACTIVITY項(xiàng)。
在handlePauseActivity方法中,主要做了以下三件事情:
A. ?A.1 ?傳入的userLeaving值為在步驟7的方法源碼中,判斷intent標(biāo)記是否有Intent.FLAG_ACTIVITY_NO_USER_ACTION,如果沒(méi)有設(shè)置,則為true。我們?cè)贏ndroidMainfest.xml文件中并沒(méi)有配置。因此此處的userLeaving為true。
? ? ?A.2 ?此時(shí)回調(diào)用performUserLeavingActivity函數(shù)來(lái)調(diào)用Activity.onUserLeaveHint通知Activity,用戶(hù)要離開(kāi)它了,進(jìn)行相應(yīng)操作。
B. ?調(diào)用performPauseActivity函數(shù)來(lái)調(diào)用LaunchActivity中的OnPause方法。
C. ?它通知ActivityManagerService,這個(gè)Activity已經(jīng)進(jìn)入Paused狀態(tài)了ActivityManagerService現(xiàn)在可以完成未竟的事情,啟動(dòng)MainActivity。
14 ?ActivityManagerProxy.activityPaused
14.a ?作用:
運(yùn)行方法,利用Binder機(jī)制執(zhí)行actiityPaused方法
14.b ?位置:(3585行)
14.c ?源碼:
看到這段代碼是不是很熟悉,是的,在此利用了代理類(lèi)來(lái)執(zhí)行了IBinder類(lèi)型mRemote變量中的transact方法,不過(guò)這次傳入的ACTIVITY_PAUSED_TRANSACTION字段,執(zhí)行的是pause方法。這時(shí)會(huì)會(huì)到ActivityManagerService中執(zhí)行activityPaused方法。
15? ActivityManagerService.activityPausedLocked
15.a ?作用:
調(diào)用ActivityStack中的activityPausedLocked方法
15.b ?位置:(6857行)
15.c ?源碼:
16 ?ActivityStack.activityPausedLocked
16.a ?作用:
執(zhí)行completePauseLocked方法
16.b ?位置:(1189行)
16.c ?源碼:
當(dāng)前一直在運(yùn)行想要轉(zhuǎn)入Pause狀態(tài)的是LaunchActivity,傳入的IBinder類(lèi)型token值則對(duì)應(yīng)的就是LaunchActivity,因此mPausingActivity與r均為L(zhǎng)aunchActivity,則執(zhí)行其中completePauseLocked方法。
17 ?ActivityStack.completePauseLocked
17.a ?作用:
調(diào)用ActivityStackSupervisor中的開(kāi)啟Activity方法
17.b ?位置:(1270行)
17.c ?源碼:
它主要負(fù)責(zé)了兩件事情,一件是將原來(lái)為L(zhǎng)aunchActivity的mPausingActivity滯空。(1311)
另外一件事情就是調(diào)用resumeFocusedStackTopActivityLocked(1317行)方法,獲得當(dāng)前堆棧頂端的Activity,如我們之前的步驟所記,我們新建了一個(gè)task,并將即將啟動(dòng)的MainActivity添加到棧頂,則當(dāng)前的Activity就是我們即將要啟動(dòng)的MainActivity,此時(shí)通過(guò)該方法,將其取出來(lái)并存儲(chǔ)與next當(dāng)中,然后最終調(diào)用其中的ActivityStackSupervisor中的startSpecificActivityLocked()方法,將next傳入,開(kāi)啟next所代表的MainActivity(2514行)。
18 ?ActivityStack.Supervisor.startSpecificActivityLocked
18.a ?作用:
判斷是否開(kāi)啟該進(jìn)程,如果沒(méi)有則調(diào)用ActivityManagerService進(jìn)行開(kāi)啟。
18.b ?位置:(1355行)
18.c ?源碼:
在進(jìn)入方法后會(huì)受限判斷該應(yīng)用是否已經(jīng)開(kāi)啟,由于我們只是剛剛點(diǎn)開(kāi)該程序,則取回來(lái)的app則肯定為空。
隨后就會(huì)調(diào)用ActivityManagerService.startProcessLocked方法進(jìn)行下一步操作。
19 ?ActivityManagerService.startProcessLocked
19.a ?作用:
調(diào)用Process.start接口來(lái)新建一個(gè)新的進(jìn)程
19.b ?位置:(3477行-3487行-3600行-3616行-3743行)
19.c ?源碼:
經(jīng)過(guò)幾個(gè)方法到跳轉(zhuǎn),最終調(diào)用到了Process.start的方法,在調(diào)用Process.start方法之前,將一個(gè)字符串entryPoint作為參數(shù)傳入到start方法中,通過(guò)該方法,我們創(chuàng)建一個(gè)新的進(jìn)程,這里涉及到了Zygote中的Socket接口監(jiān)聽(tīng)并調(diào)用孵化APP進(jìn)程的過(guò)程,這里我們?cè)敿?xì)說(shuō)明一下:
19.c.A ? 調(diào)用Process.start方法
19.c.B? 內(nèi)部調(diào)用了startViaZygote方法,我們?cè)俚皆摲椒ㄖ锌匆幌拢?/p>
19.c.C? 可以發(fā)現(xiàn)在其最后,又調(diào)用了zygoteSendArgsAndGetResult方法:
19.c.D? 在zygoteSendArgsAndGetResult方法中,可以看到它調(diào)用了zygoteState對(duì)象(Zygote孵化完成后,開(kāi)啟到監(jiān)聽(tīng)Socket),并借該對(duì)象通過(guò)Socket通信機(jī)制,讓Zygote進(jìn)程fork除了一個(gè)新的進(jìn)程,并根據(jù)startProcessLocked方法中傳遞來(lái)的entryPoint(”android.app.ActivityThread”)字符串,反射出該對(duì)象并執(zhí)行ActivityThread的main方法。此時(shí)我們可以進(jìn)入ActivityThread的main函數(shù)中看下進(jìn)行了哪些操作。
20 ?ActivityThread.main
20.a ?作用:
創(chuàng)建消息循環(huán)及接收處理機(jī)制,并最終調(diào)用ActivityManagerService中的attachApplication。
20.b ?位置:
20.c ?源碼:
進(jìn)程在創(chuàng)建完成以后,調(diào)用了ActivityThread中的main函數(shù),其中調(diào)用了attach函數(shù),隨后調(diào)用Looper的消息循環(huán)機(jī)制進(jìn)行消息循環(huán)。
在attach方法中(5888行),通過(guò)ActivityMangerNative.getDefault方法獲得到了ActivityManager的代理類(lèi)ActivityManagerProxy,調(diào)用其中的attachApplication(3544行)函數(shù)。
該方法中又發(fā)現(xiàn)了我們熟悉的Binder類(lèi)型對(duì)象mRemote,再次通過(guò)Binder機(jī)制,根據(jù)傳入的ATTACH_APPLICATION_TRANSACTION字段,調(diào)用ActivityManagerService中的attachApplication方法(534行)。
21 ?ActivityManagerService.attachApplication
21.a ?作用:
方法調(diào)用ActivityStackSupervisor類(lèi)中的attachApplicationLocked方法。
21.b ?位置:(6610行)
21.c ?源碼:
內(nèi)部操作轉(zhuǎn)發(fā)給了attachApplicationLocked方法(6384行)。
最終會(huì)調(diào)用位于6550行的ActivityStackSupervisor類(lèi)中的attachApplicationLocked方法。
22 ?ActivityStackSupervisor.attachApplicationLocked
22.a ?作用:
將此時(shí)將啟動(dòng)的MainActivity傳遞給realStartActivityLocked進(jìn)行正式啟動(dòng)。
22.b ?位置:(825行)
22.c ?源碼:
在該方法中,可以發(fā)現(xiàn)其通過(guò)調(diào)用topRunningActivityLocked將此時(shí)位于棧頂?shù)腗ainActivity 取出來(lái),存儲(chǔ)于ActivityRecord類(lèi)型的hr變量中,并將hr傳遞給realStartActivityLocked方法進(jìn)行開(kāi)啟。
通過(guò)realStartActivityLocked方法,最終通過(guò)app.thread進(jìn)入到ApplicationThreadProxy的scheduleLaunchActivity函數(shù)中(709行),注意,這里的第二個(gè)參數(shù)r,是一個(gè)ActivityRecord類(lèi)型的Binder對(duì)象,用來(lái)作來(lái)這個(gè)Activity的token值。此時(shí)我們進(jìn)入到ActivityThreadProxy類(lèi)中進(jìn)行查看。
此方法就是將即將啟動(dòng)的Activity信息進(jìn)行封裝,并以LAUNCH_ACTIVITY的形式發(fā)送出去。最終交給ActivityThread中的HandleMessage進(jìn)行處理。
然后再次移交給handleLaunchActivity進(jìn)行處理。
23 ?ActivityThread.HandleMessage
23.a ?作用:
23.b ?位置:(2687行)
23.c ?源碼:
方法里主要執(zhí)行了兩個(gè)步驟:
第一個(gè)步驟執(zhí)行了performLaunchActivity方法,該方法加載了這個(gè)Activity類(lèi),即MainActivity,然后調(diào)用它的onCreate函數(shù),
第二步在回到handleLaunchActivity函數(shù)時(shí),再調(diào)用handleResumeActivity函數(shù)來(lái)使這個(gè)Activity進(jìn)入Resumed狀態(tài),即會(huì)調(diào)用這個(gè)Activity的onResume函數(shù),這是遵循Activity的生命周期的。
我們這里主要研究一下performLaunchActivity方法。
24? ActivityThread.performLaunchActivity
24.a ?作用:
保存組件信息,加載需要啟動(dòng)的Activity類(lèi),創(chuàng)建Application對(duì)象,并調(diào)用執(zhí)行onCreate方法
24.b ?位置:(2687行)
24.c ?源碼:
這段代碼主要負(fù)責(zé)了收集啟動(dòng)的Activity的package和component信息。
這段代碼主要負(fù)責(zé)將啟動(dòng)的Activity的類(lèi)加載到內(nèi)存當(dāng)中
根據(jù)AndroidMainfest.xml中配置的Application信息,創(chuàng)建Application對(duì)象。
根據(jù)記錄到ActivityRecord中的信息,設(shè)置Activity中的配置信息,以及上下文信息等
最后通過(guò)mInstrumentation的callActivityOnCreate函數(shù)來(lái)間接調(diào)用,前面我們說(shuō)過(guò),mInstrumentation在這里的作用是監(jiān)控Activity與系統(tǒng)的交互操作,相當(dāng)于是系統(tǒng)運(yùn)行日志。
到這里,從點(diǎn)擊app到啟動(dòng)app執(zhí)行onCreate方法到一整個(gè)流程就進(jìn)行完畢了。