(frameworks/base/core/java/android/app/Activity.java)
startActivity() {
----startActivityForResult() {
--------mInstrumentation.execStartActivity()
----}
}
(frameworks/base/core/java/android/app/Instrumentation.java)
execStartActivity() {
----ActivityManager.getService().startActivity()
}
ActivityManager.getService()返回的是個(gè)IActivityManager
ActivityManagerService/ActivityTaskManagerService繼承了IActivityManager.Stub,
注意:這里其實(shí)就是 Luncher進(jìn)程 與 AMS(SystemServer系統(tǒng)服務(wù)進(jìn)程) 通過(guò)Binder跨進(jìn)程通信,調(diào)用到了AMS內(nèi)的startActivity()
(frameworks/base/core/java/android/server/am/ActivityManagerService.java)
startActivity() {
----startActivityAsUser() {
--------mActivityStarter.startActivityMayWait()
----}
}
(frameworks/base/core/java/android/server/am/ActivityStarter.java)
startActivityMayWait() {
----startActivity() {
--------startActivityUnchecked() {
-----------經(jīng)過(guò)方法調(diào)用...進(jìn)入ActivityStackSupervisor(Activity棧管理相關(guān))
-----------經(jīng)過(guò)方法調(diào)用...進(jìn)入ActivityStack(Activity棧)
--------}
----}
}
(frameworks/base/core/java/android/server/am/ActivityStack.java)
resumeTopActivityInnerLocked() {
----mStackSupervisor.startSpecificActivityLocked()
}
最終會(huì)執(zhí)行startSpecificActivityLocked()
(frameworks/base/core/java/android/server/am/ActivityStackSupervisor.java)
startSpecificActivityLocked() {
----if (要啟動(dòng)Activity的應(yīng)用進(jìn)程是否存在) {
--------realStartActivityLocked()
----} else {
--------//注意:AMS(系統(tǒng)服務(wù)進(jìn)程)通過(guò)Socket跨進(jìn)程請(qǐng)求 Zygote進(jìn)程 fork出應(yīng)用進(jìn)程
--------mService.startProcessLocked()
----}
}
realStartActivityLocked() {
----app.thread.scheduleLauchActivity()
}
這里的app表示要啟動(dòng)的Activity所在的進(jìn)程。app.thread是IApplicationThread類型,是AIDL文件,那么繼續(xù)尋找,發(fā)現(xiàn)AcitvityThread的內(nèi)部類ApplicationThread實(shí)現(xiàn)了IApplicationThread.Stub。
注意:這里其實(shí)就是 AMS(SystemServer系統(tǒng)服務(wù)進(jìn)程) 與 應(yīng)用進(jìn)程 通過(guò)Binder跨進(jìn)程通信,調(diào)用到了應(yīng)用進(jìn)程內(nèi)AcitivtyThread的scheduleLaunchActivity()。
(frameworks/base/core/java/android/app/AcitivtyThread.java)
scheduleLaunchActivity() {
----sendMessage(H.LAUNCH_ACTIVITY, r);
}
這里調(diào)用了ActivityThread類內(nèi)的sendMessage方法。該方法最終調(diào)用了內(nèi)部Handler子類H的handleMessage方法。
注意:這里其實(shí)就是 Handler通信
(frameworks/base/core/java/android/app/AcitivtyThread.java)
private class H extends Handler {
----handleMessage() {
--------handleLaunchActivity() {
------------performLaunchActivity() {
----------------mInstrumentation.newActivity();// 調(diào)用Instrumenation的newActivity方法(其內(nèi)通過(guò)ClassLoader創(chuàng)建Activity實(shí)例)創(chuàng)建Activity。
------------}
--------}
----}
}
總結(jié):冷啟動(dòng)流程
- 1.點(diǎn)擊桌面App圖標(biāo),Launcher進(jìn)程采用Binder IPC向system_server進(jìn)程發(fā)起startActivity請(qǐng)求;
- 2.system_server進(jìn)程接收到請(qǐng)求后,向zygote進(jìn)程發(fā)送創(chuàng)建進(jìn)程的請(qǐng)求;
- 3.Zygote進(jìn)程fork出新的子進(jìn)程,即App進(jìn)程;
- 4.App進(jìn)程,通過(guò)Binder IPC向sytem_server進(jìn)程發(fā)起attachApplication請(qǐng)求;
- 5.system_server進(jìn)程在收到請(qǐng)求后,進(jìn)行一系列準(zhǔn)備工作后,再通過(guò)binder IPC向App進(jìn)程發(fā)送scheduleLaunchActivity請(qǐng)求;
- 6.App進(jìn)程的binder線程(ApplicationThread)在收到請(qǐng)求后,通過(guò)handler向主線程發(fā)送LAUNCH_ACTIVITY消息;
- 7.主線程在收到Message后,通過(guò)發(fā)射機(jī)制創(chuàng)建目標(biāo)Activity,并回調(diào)Activity.onCreate()等方法。
到此,App便正式啟動(dòng),開(kāi)始進(jìn)入Activity生命周期,執(zhí)行完onCreate/onStart/onResume方法,UI渲染結(jié)束后便可以看到App的主界面。