android基礎-Activity啓動流程

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章