Android APP


注:以下內容基於Android API Version 27(Android 8.1)Linux Kernel 3.18.0

AMS/WMS/APP角色概述

AMS

掌管著所有App進程的啟動,App四大組件的啟動,App之間及App內部頁面之間切換和各種組件的生命週期,AMS不控制窗口的顯示,只控制各種組件的創建和運行。

WMS

掌管著所有App窗口的層疊計算。WMS被App用來顯示自己的窗口,但WMS自己不具備顯示能力,WMS只負責綜合系統中所有的窗口,計算出疊放順序和顯示區域,然後將窗口信息交給SurfaceFliner,由SurfaceFlinger執行真正的窗口合成和顯示。

WMS作為App和SurfaceFlinger的橋樑,將SufaceFlinger為窗口創建的Suface交給App,由App在Surface上進行繪製。

WMS同時為App和input系統牽線搭橋,為事件派發創建通道,將通道的一端鏈接在input系統另一端交給App,WMS將窗口的焦點信息和位置大小信息交給input系統,以便input系統確定事件的派發目標。

App

App負責四大組件真正的創建和相應生命週期的調用。 App用WMS返回給它的Suface進行繪圖,然後通知SurfaceFlinger進行圖像合成,App不直接控制Surface的大小和位置,而是通知WMS進行控制,App只管在Surface上繪圖。

App、AMS和WMS之間的交互

App進程和AMS

App進程啟動的時候將一個實現了IApplicationThread的binder對象交給AMS,以後AMS就用這個IApplicationThread調用App的功能,AMS啟動Activity時會為Activity創建一個唯一的token(實現了IApplicationToken的binder對象),將這個token對象交給App進程。

AMS和WMS

AMS最先收到啟動Activity的消息,為Activity創建token後將token添加到WMS的一個map中。(AMS和WMS在同一個進程所以可以直接調用)

App進程和WMS

App進程收到AMS啟動Activity的調用後創建Activity,然後調用WMS添加和顯示窗口。App會為Activity創建一個實現了IWindow的binder對象,將這個binder對象傳給WMS,以便WMS檢測到App窗口需要調整大小或者焦點時通知App,App同時會將AMS創建的Activity的 token傳給WMS,WMS通過傳來的token確認之前AMS添加過同樣的token,然後為窗口創建WindowState將IWindow和token等信息保存起來。

總結

App通過IActivityManager調用AMS,AMS通過IApplicationThread調用App。 App通過IWindowManager調用WMS,WMS通過IWindow調用App。 IApplicationToken由AMS創建,同時保存於AMS、WMS和App進程,作為一個Activity在三方的唯一憑證。


作者:GaoGao
鏈接:https://juejin.im/post/5e53cdccf265da5740641f3b


來源:掘金
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。


分享到:


相關文章: