無論是通過點擊應用程序圖標來啟動Activity,還是通過Activity內部調用startActivity接口來啟動新的Activity,都要借助於應用程序框架層的ActivityManagerService服務進程。在前面一篇文章Android系統在新進程中啟動自定義服務過程(startService)的原理分析中,我們已經看到,Service也是由ActivityManagerService進程來啟動的。在Android應用程序框架層中,ActivityManagerService是一個非常重要的接口,它不但負責啟動Activity和Service,還負責管理Activity和Service。
Android應用程序框架層中的ActivityManagerService啟動Activity的過程大致如下圖所示:
在這個圖中,ActivityManagerService和ActivityStack位於同一個進程中,而ApplicationThread和ActivityThread位於另一個進程中。其中,ActivityManagerService是負責管理Activity的生命周期的,ActivityManagerService還借助ActivityStack是來把所有的Activity按照后進先出的順序放在一個堆棧中;
對於每一個應用程序來說,都有一個ActivityThread來表示應用程序的主進程,而每一個ActivityThread都包含有一個ApplicationThread實例,它是一個Binder對象,負責和其它進程進行通信。
下面簡要介紹一下啟動的過程:
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類,然后把它啟動起來。