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
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/250712.html
標籤:其他
