Activity啓動機制

如下資料摘錄整理自老羅的Android之旅博客,是對老羅的博客關於Android底層原理的一個抽象的知識歸納總結(若有錯誤歡迎指出)(侵刪):
http://blog.csdn.net/luoshengyang/article/details/8923485
http://blog.csdn.net/luoshengyang/article/details/12957169app

整理by Doing框架

 

        在Android系統中,有兩種操做會引起Activity的啓動:
  1. 用戶點擊應用程序圖標時,Launcher會爲咱們啓動應用程序的主Activity;
  2. 應用程序的默認Activity啓動起來後,它又能夠在內部經過調用startActvity接口啓動新的Activity,依此類推,每個Activity均可以在內部啓動新的Activity。
 
         不管是經過點擊應用程序圖標來啓動Activity,仍是經過Activity內部調用startActivity接口來啓動新的Activity,都要藉助於應用程序框架層的 ActivityManagerService服務進程。(Service也是由ActivityManagerService進程來啓動的。)在Android應用程序框架層中,ActivityManagerService是一個很是重要的接口,它不但負責 啓動Activity和Service,還負責 管理Activity和Service
 
Android應用程序框架層中的ActivityManagerService啓動Activity的過程:
        在這個圖中, ActivityManagerService和ActivityStack位於同一個進程中,而 ApplicationThread和ActivityThread位於另外一個進程中
ActivityManagerService是負責管理Activity的生命週期的,ActivityManagerService還藉助ActivityStack是來把全部的Activity按照後進先出的順序放在一個堆棧中
        對於每個應用程序來講,都有一個 ActivityThread來表示 應用程序的主進程,而每個ActivityThread都包含有一個 ApplicationThread實例,它是一個 Binder對象,負責和其它進程進行通訊。
 
 

Activity啓動的過程函數

       Step 1. 不管是經過Launcher來啓動Activity,仍是經過Activity內部調用startActivity接口來啓動新的Activity,都經過 Binder進程間通訊進入到ActivityManagerService進程中,而且調用ActivityManagerService.startActivity接口;
        Step 2. ActivityManagerService調用ActivityStack.startActivityMayWait來作準備要啓動的Activity的相關信息;
        Step 3. ActivityStack通知ApplicationThread要進行Activity啓動調度了,這裏的ApplicationThread表明的是調用ActivityManagerService.startActivity接口的進程,對於經過點擊應用程序圖標的情景來講,這個進程就是Launcher了,而對於經過在Activity內部調用startActivity的情景來講,這個進程就是這個Activity所在的進程了;
        Step 4. ApplicationThread不執行真正的啓動操做,它經過調用ActivityManagerService.activityPaused接口進入到ActivityManagerService進程中,看看是否須要建立新的進程來啓動Activity;
        Step 5. 對於經過點擊應用程序圖標來啓動Activity的情景來講,ActivityManagerService在這一步中,會調用startProcessLocked來建立一個新的進程;而對於經過在Activity內部調用startActivity來啓動新的Activity來講,這一步是不須要執行的,由於新的Activity就在原來的Activity所在的進程中進行啓動;
        Step 6. ActivityManagerServic調用ApplicationThread.scheduleLaunchActivity接口,通知相應的進程執行啓動Activity的操做;
        Step 7. ApplicationThread把這個啓動Activity的操做轉發給ActivityThread,ActivityThread經過ClassLoader導入相應的Activity類,而後把它啓動起來。
 
 
 

Android應用程序啓動過程(點擊應用程序圖標ui

       一. Launcher經過Binder進程間通訊機制通知ActivityManagerService,它要啓動一個Activity;
       二. ActivityManagerService經過Binder進程間通訊機制通知Launcher進入Paused狀態;
       三. Launcher經過Binder進程間通訊機制通知ActivityManagerService,它已經準備就緒進入Paused狀態,因而ActivityManagerService就建立一個新的進程,用來啓動一個ActivityThread實例,即將要啓動的Activity就是在這個ActivityThread實例中運行;
       四. ActivityThread經過Binder進程間通訊機制將一個 ApplicationThread類型的Binder對象傳遞給ActivityManagerService,以便之後ActivityManagerService可以經過這個Binder對象和它進行通訊;
       五. ActivityManagerService經過Binder進程間通訊機制通知 ActivityThread,如今一切準備就緒,它能夠 真正執行Activity的啓動操做了。
 
 

Android應用程序內部啓動Activity過程(startActivity)spa

       一. 應用程序的MainActivity經過Binder進程間通訊機制通知ActivityManagerService,它要啓動一個新的Activity;
       二. ActivityManagerService經過Binder進程間通訊機制通知MainActivity進入Paused狀態;
       三. MainActivity經過Binder進程間通訊機制通知ActivityManagerService,它已經準備就緒進入Paused狀態,因而ActivityManagerService就準備要在MainActivity所在的進程和任務中啓動新的Activity了;
       四. ActivityManagerService經過Binder進程間通訊機制通知MainActivity所在的 ActivityThread,如今一切準備就緒,它能夠 真正執行Activity的啓動操做了。
 
 
 

Android應用程序在新的進程中啓動新的Activity.net

        函數 ActivityStack.startSpecificActivityLocked函數中,決定一個Activity是在新的進程中啓動仍是在原有的進程中啓動的因素有兩個,一個是看這個 Activity的process屬性的值,另外一個是這個 Activity所在的應用程序的uid。(應用程序的UID是由系統分配的,而Activity的process屬性值,是能夠在AndroidManifest.xml文件中進行配置的,若是沒有配置,它默認就爲application標籤的process屬性值,若是application標籤的process屬性值也沒有配置,那麼,它們就默認爲應用程序的package名。)
        這裏就是 根據processName和uid在系統查找是否已有相應的進程存在,若是已經有了,就會調用realStartActivityLocked來直接啓動     Activity,不然的話,就要 經過調用ActivityManagerService.startProcessLocked函數來建立一個新的進程,而後在新進程中啓動這個Activity了。對於前者,與Android應用程序內部啓動Activity過程(startActivity)相同;然後者,與Android應用程序啓動過程(點擊應用程序圖標)相同。
相關文章
相關標籤/搜索