Activity-啓動流程完整版
hi, 大家好,我是愛喫香蕉的猴子,最近一直在摸索Activity的啓動流程,一直在參考的學習書籍是Android系統源代碼情景分析_羅昇陽我有電子版但是考慮版權問題,需要的朋友可以支持正版,若僅需要看部分內容的可以評論留言,我分享給你,閒話少說,搞起來 。。。
新規矩,先猜測後code再總結:在launcher上點擊app
- Launcher組件啓動MainActivity組件的過程如下所示。
- (1)Launcher組件向ActivityManagerService發送一個啓動MainActivity組件的進程間通信請求。
- (2)ActivityManagerService首先將要啓動的MainActivity組件的信息保存下來,然後再向Launcher組件發送一個進入中止狀態的進程間通信請求。
- (3)Launcher組件進入到中止狀態之後,就會向ActivityManagerService發送一個已進入中止狀態的進程間通信請求,以便ActivityManagerService可以繼續執行啓動MainActivity組件的操作。(先將上一個Activity pause然後再啓動新Activity)
- (4)ActivityManagerService發現用來運行MainActivity組件的應用程序進程不存在,因此,它就會先啓動一個新的應用程序進程。(先啓動進程)
- (5)新的應用程序進程啓動完成之後,就會向ActivityManagerService發送一個啓動完成的進程間通信請求,以便ActivityManagerService可以繼續執行啓動MainActivity組件的操作。
- (6)ActivityManagerService將第2步保存下來的MainActivity組件的信息發送給第4步創建的應用程序進程,以便它可以將MainActivity組件啓動起來。
- 宏觀上圖解一下 前五個步驟,大家應該都比較熟悉Activity ---> AMS
- 在AMS中的處理,主要在ActivityStack中的處理
- ActivityStack類有三個成員變量mResumedActivity、mLastPausedActivity和mPausingActivity,它們的 類型均爲ActivityRecord,分別用來描述系統當前激活的Activity組件、上一次被中止的Activity組件, 以及正在被中止的Activity組件。
- 由於系統當前正在激活的Activity組件是Launcher組件,即ActivityStack類的成員變量
mResumedActivity指向了Launcher組件。 - 成員函 數startPausingLocked來通知它進入Paused狀態,以便它可以將焦點讓給即將要啓動的MainActivity組件。
- Launcher組件處理完ActivityManagerService給它發送的中止通知之後,必須再向ActivityManagerService 發送一個啓動MainActivity組件的通知,以便ActivityManagerService可以將位於Activity組件堆棧頂端 的MainActivity組件啓動起來。
- 7步都是在ActivityManagerService中執行的,接下來第13步到第17步是在應用程序Launcher 中執行的,主要用來處理ActivityManagerService發出的類型爲SCHEDULE_PAUSE_ACTIVITY_ TRANSACTION的進程間通信請求。
- 第一件事情是調用成員函數performUserLeavingActivity向Launcher組件發送一個用戶離開事件通 知,即調用它的成員函數onUserLeaveHint.
- 第二件事情是調用成員函數performPauseActivity向Launcher組件發送一箇中止事件通知,即調用 它的成員函數onPause。
- 第三件事情是調用QueuedWork類的靜態成員函數waitToFinish等待完成前面的一些數據寫入操 作,例如,將數據寫入到磁盤的操作。由於現在Launcher組件即將要進入Paused狀態了,因此就要保 證它前面的所有數據寫入操作都處理完成;否則,等到它重新進入Resumed狀態時,就無法恢復之前 所保存的一些狀態數據.
- 執行完成這三件事情之後,ActivityThread類的成員函數handlePauseActivity就處理完 ActivityManagerService給它發送的中止Launcher組件的進程間通信請求了。
- 以上5步都是在應用程序Launcher中執行的,接下來第18步到第23步是在ActivityManagerService中 執行的,主要用來處理Launcher組件發出的類型爲ACTIVITY_PAUSED_TRANSACTION的進程間通信 請求.
- 應用進程的啓動
- 第一件事情是在進程中創建一個ActivityThread對象,並且調用它的成員函數attach向ActivityManagerService 發送一個啓動完成通知。
- 第二件事情是調用Looper類的靜態成員函數prepareMainLooper創建一個消息循環,並且在向 ActivityManagerService發送啓動完成通知之後,使得當前進程進入到這個消息循環中。
- 主要是用來處理新的應用程序進程發出的類型爲ATTACH_APPLICATION_TRANSACTION的 進程間通信請求。
- 主要用來處理ActivityManagerService發出的類型爲SCHEDULE_LAUNCH_ACTIVITY_ TRANSACTION的進程間通信請求。
TODO