概述
在 Android 中,APK 運行在 App 進程,而 AMS 運行在 system_server 進程,AMS 承擔着對 Activity 的生命週期的管理等工作,而 Activity 生命週期函數的回調又是在 App 進程中進行的,App 進程需要頻繁的和 AMS 進程進行通信。那麼理解 AMS 進程和 App 進程之間的通信就對 Activity 的啓動流程的理解有很好的鋪墊作用。因此在介紹 Activity 的啓動流程之前我們先來學習一下 AMS 進程和 App 進程之間是如何通信的。
提起到 Android 進程間通信,我們自然就想到了 Binder。是的,AMS 和 APP 之間肯定也是通過 Binder 進行通信的。下面進行詳細的介紹。
本文涉及到的類包含:
frameworks/base/core/java/android/app/ActivityManagerNative.java
frameworks/base/core/java/android/app/ActivityManagerNative$ActivityManagerProxy.java
frameworks/base/core/java/android/app/ApplicationThreadNative.java
frameworks/base/core/java/android/app/ApplicationThreadNative$ApplicationThreadProxy.java
frameworks/base/core/java/android/app/ActivityThread.java
frameworks/base/core/java/android/app/ActivityThread$ApplicationThread.java
相關類關係圖
進程間通信
下面通過一個圖來表示一下 AMS 和 APP 的通信,該圖片摘自Weishu Note,描述的很好,直接拿來用來。
在 App 進程側,App 進程作爲Binder的客戶端當發起啓動 Activity
時,通過作爲服務端的代理對象的 ActivityManagerProxy
來發起遠程調用,此時 system 進程作爲服務端,ActivityManagerNative
作爲 Binder
本地對象收到遠程調用後,由它的實現類 ActivityManagerService
完成相應的生命週期管理以及任務棧管理後,會把控制權交給App進程,讓App進程完成Activity類對象的創建,以及生命週期回調。
接下來的調用 system 進程作爲客戶端,App 進程作爲服務端,通過system進程作爲服務端的代理對象的 ApplicationThreadProxy
發起調用,ApplicationThread
作爲服務端的 Binder
本地對象收到遠程調用後,通過 Handler
發送消息由 ActivityThread
進程處理。
瞭解了這些知識後再看Android startActivity 流程分析的流程圖,會有助於理解