天天看點

Activity啟動流程中AMS的具體流程

調用Activity的startActivity實際是内部是調用了startActivityForResult.而在startActivityForResult内部是調用了Instrumentation的execStartActivity。execStartActivity内部調用AmS的startActivity(Binder機制)。AmS執行startActivity期間先做一些與棧相關的工作(擷取要啟動Activity相關資訊ActivityRecord,棧的建立、檢查權限等等)。

AmS的startActivity調用過程如下:

—-ActivityStackSupervisor.startActivityMayWait(直接調用,沒有其他代碼):從Intent裡解析需要啟動的Activity的相關資訊。如:包名、類名。相關資訊存在ResolveInfo類中,通過該類裡面得到ActivityInfo對象。

—-ActivityStackSupervisor.startActivityLocked:通過傳入的caller形參(IApplicationThread類型,從Activity的startActivity函數就開始一個個函數調用傳入)得到調用者程序相關資訊,儲存到callerApp(ProcessRecord類型)變量中,然後建立要啟動的Activity相關資訊。儲存到r(ActivityRecord)變量中。

—-ActivityStackSupervisor.startActivityUncheckedLocked:擷取Activity的啟動模式、判斷要啟動的Activity是否在棧頂、得到Activity加載的棧。

—-ActivityStack.resumeTopActivitiesLocked:確定被調用的Activity所在的棧處于頂端。

—-ActivityStack.resumeTopActivityInnerLocked:判斷要啟動的Activity所在的棧是否對目前使用者不可見,如果不可見就不需要繼續執行下去,因為即使把這個Activity啟動起來,使用者也看不見,還不如先把它儲存起來,等到下次可見的時候再啟動。若可見,則繼續執行。把要啟動的Activity添加到棧頂。

—-ActivityStackSupervisor.startSpecificActivityLocked:主要跟要啟動的Activity程序相關。如判斷所再程序是否已經運作、判斷是否另開程序。如果沒有指定新程序,即直接用預設程序,則直接調用realStartActivityLocked。

—-ActivityStackSupervisor.realStartActivityLocked:通過Binder驅動進入到ApplicationThread的scheduleLaunchActivity函數。

做完這些工作,AmS通過Binder調ApplicationThread(是個Binder對象)的scheduleLaunchActivity . ApplicationThread通過消息機制控制Activity生命周期。