如下資料摘錄整理自老羅的Android之旅博客,是對老羅的博客關於Android底層原理的一個抽象的知識歸納總結(若有錯誤歡迎指出)(侵刪):
http://blog.csdn.net/luoshengyang/article/details/8923485
http://blog.csdn.net/luoshengyang/article/details/12957169app
整理by Doing框架
在Android系統中,有兩種操做會引起Activity的啓動:
- 用戶點擊應用程序圖標時,Launcher會爲咱們啓動應用程序的主Activity;
- 應用程序的默認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應用程序啓動過程(點擊應用程序圖標)相同。