原文鏈接:https://blog.csdn.net/u012267215/article/details/91406211
Activity啟動流程(從Launcher開始):

第一階段: Launcher通知AMS要啟動新的Activity(在Launcher所在的進程執(zhí)行)
Launcher.startActivitySafely //首先Launcher發(fā)起啟動Activity的請求
Activity.startActivity
Activity.startActivityForResult
Instrumentation.execStartActivity //交由Instrumentation代為發(fā)起請求
ActivityManager.getService().startActivity //通過IActivityManagerSingleton.get()得到一個AMP代理對象
ActivityManagerProxy.startActivity //通過AMP代理通知AMS啟動activity
第二階段:AMS先校驗一下Activity的正確性,如果正確的話,會暫存一下Activity的信息。然后,AMS會通知Launcher程序pause Activity(在AMS所在進程執(zhí)行)
ActivityManagerService.startActivity
ActivityManagerService.startActivityAsUser
ActivityStackSupervisor.startActivityMayWait
ActivityStackSupervisor.startActivityLocked :檢查有沒有在AndroidManifest中注冊
ActivityStackSupervisor.startActivityUncheckedLocked
ActivityStack.startActivityLocked :判斷是否需要創(chuàng)建一個新的任務(wù)來啟動Activity。
ActivityStack.resumeTopActivityLocked :獲取棧頂?shù)腶ctivity,并通知Launcher應(yīng)該pause掉這個Activity以便啟動新的activity。
ActivityStack.startPausingLocked
ApplicationThreadProxy.schedulePauseActivity
第三階段: pause Launcher的Activity,并通知AMS已經(jīng)paused(在Launcher所在進程執(zhí)行)
ApplicationThread.schedulePauseActivity
ActivityThread.queueOrSendMessage
H.handleMessage
ActivityThread.handlePauseActivity
ActivityManagerProxy.activityPaused
第四階段:檢查activity所在進程是否存在,如果存在,就直接通知這個進程,在該進程中啟動Activity;不存在的話,會調(diào)用Process.start創(chuàng)建一個新進程(執(zhí)行在AMS進程,內(nèi)部通過socket和Zygote通信,fork一個新進程)
ActivityManagerService.activityPaused
ActivityStack.activityPaused
ActivityStack.completePauseLocked
ActivityStack.resumeTopActivityLocked
ActivityStack.startSpecificActivityLocked
ActivityManagerService.startProcessLocked
Process.start //在這里創(chuàng)建了新進程,新的進程會導(dǎo)入ActivityThread類,并執(zhí)行它的main函數(shù)
第五階段: 創(chuàng)建ActivityThread實例,執(zhí)行一些初始化操作,之后進入Loop循環(huán)。(執(zhí)行在新創(chuàng)建的app進程)
ActivityThread.main
ActivityThread.attach(false) //聲明不是系統(tǒng)進程
ActivityManagerProxy.attachApplication//綁定ApplicationThread,在ActivityThread被創(chuàng)建時初始化
第六階段:處理新的應(yīng)用進程發(fā)出的創(chuàng)建進程完成的通信請求,并通知新應(yīng)用程序綁定Application。如果Application不存在,會調(diào)用LoadedApk.makeApplication創(chuàng)建一個新的Application對象。并且通知進程啟動目標(biāo)Activity組件(執(zhí)行在AMS進程)
ActivityThread.bindApplication
ActivityManagerService.attachApplication //AMS綁定本地ApplicationThread對象,后續(xù)通過ApplicationThreadProxy來通信。
ActivityManagerService.attachApplicationLocked
ActivityStack.realStartActivityLocked //真正要啟動Activity了!
ApplicationThreadProxy.scheduleLaunchActivity //AMS通過ATP通知app進程啟動Activity
第七階段: 加載MainActivity類,調(diào)用onCreate聲明周期方法(執(zhí)行在新啟動的app進程)
ApplicationThread.scheduleLaunchActivity //ApplicationThread發(fā)消息給AT
ActivityThread.queueOrSendMessage
H.handleMessage //AT的Handler來處理接收到的LAUNCH_ACTIVITY的消息
ActivityThread.handleLaunchActivity
ActivityThread.performLaunchActivity
Instrumentation.newActivity //調(diào)用Instrumentation類來新建一個Activity對象
Instrumentation.callActivityOnCreate
MainActivity.onCreate
ActivityThread.handleResumeActivity
AMP.activityResumed
AMS.activityResumed(AMS進程)