Activity啟動過程


--摘自《Android進階解密》

根Activity啟動過程中會涉及4個進程,分別是Zygote進程、Launcher進程、AMS所在進程(SystemServer進程)、應用程序進程,關系圖如下

其中步驟2采用的是Socket通信,步驟1和4采用的是Binder通信

如果是普通Activity啟動過程會涉及兩個進程:AMS所在進程和應用程序進程

 

啟動過程

第一步:Launcher請求AMS過程

1)Android8.0之前是通過ActivityManagerNative的getDefault來獲取AMS的代理對象的,現在這個邏輯封裝到了ActivityManager中而不是ActivityManagerNative中

2)Android8.0之前並沒有采用AIDL,而是采用了類似AIDL的形式,用AMS的代理對象ActivityManagerProxy來與AMS進行進程間通信,Android8.0去除了ActivityManagerNative的內部類ActivityManagerProxy,代替它的是IActivityManager,它是AMS在本地的代理。

第二步:AMS到ApplicationThread的調用過程

1)UserHandle.getCallingUserId(),這個方法會獲得調用者的UserId,AMS根據這個UserId來確定調用者的權限

2)TaskRecord代表啟動的Activity所在的棧

3)ActivityRecord用於描述一個Activity,用來記錄一個Activity的所有信息

4)ApplicationThread繼承了IApplicationThread.Stub,是AMS所在進程(SystemServer進程)和應用程序進程的通信橋梁

第三步:ActivityThread啟動Activity的過程

1)ApplicationThread是ActivityThread的內部類

2)H,它是ActivityThread的內部類並繼承自Handler,是應用程序進程中主線程的消息管理類。因為ApplicationThread是一個Binder,它的調用邏輯運行在Binder線程池中,所以這里需要用H將代碼的邏輯切換到主線程中

3)應用程序進程要啟動Activity時需要將該Activity所屬的APK加載進來,而LoadedApk就是用來描述已加載的APK文件的

歡迎關注的微信公眾號:安卓圈


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM