Android系統(tǒng)服務(wù) —— WMS

“可以毫不夸張的說,Android的framework層主要是由WMS、AMS還有View所構(gòu)成,這三個模塊穿插交互在整個framework中,掌握了它們之間的關(guān)系和每一個邏輯步驟,你對framework的了解至少有百分之五十”。這是《Android源碼與設(shè)計模式》作者的原話,最近學(xué)習(xí)WMS和AMS相關(guān)知識,的確非常復(fù)雜,這篇文章是在學(xué)習(xí)之初的初步整理,雖然內(nèi)容不夠細致,但對其也算有個宏觀的了解。難點是其中具體的代碼邏輯,也都在相應(yīng)框架下給出了參考鏈接,日后的工作就是詳細學(xué)習(xí)其中的代碼邏輯,讓整個框架在腦海中越來越細致、清晰。

AMS與WMS

在沒有深入了解AMS與WMS前,對它倆負責(zé)的功能一直很模糊,一直搞不清區(qū)別。所以在深入理解其中之一時,先對它們在Android中各自負責(zé)的任務(wù)有個基本的了解和區(qū)分。

此外,AMS和WMS都屬于Android中的系統(tǒng)服務(wù),系統(tǒng)服務(wù)有很多,它們在Android體系架構(gòu)中都屬于同一層次,所以最好在深入了解它們各自的運行機理前,對系統(tǒng)的宏觀架構(gòu)能夠有所掌握,也就是在自己的腦海中能夠搭建一個簡單的模型和框架,搞清楚它們在系統(tǒng)中所扮演的角色。每當我們學(xué)習(xí)了一個新的知識點,都是對這個模型的填充和細化,并能夠較好的與之前所學(xué)的知識結(jié)合起來,既有利于理解,也有利于記憶,而且還能夠感受到自己的積累與進步。

下面先簡單對AMS與WMS作個簡單的介紹,以解我之前的疑惑。

Activity與WIndow:

  • Activity只負責(zé)生命周期和事件處理
  • Window只控制視圖
  • 一個Activity包含一個Window,如果Activity沒有Window,那就相當于Service

AMS與WMS:

  • AMS統(tǒng)一調(diào)度所有應(yīng)用程序的Activity
  • WMS控制所有Window的顯示與隱藏以及要顯示的位置
    在視圖層次中,Activity在WIndow之上,如下圖


    Android應(yīng)用程序窗口模型

WMS

基礎(chǔ)了解

WindowManagerService服務(wù)的實現(xiàn)是相當復(fù)雜的,畢竟它要管理的整個系統(tǒng)所有窗口的UI,而在任何一個系統(tǒng)中,窗口管理子系統(tǒng)都是極其復(fù)雜的。

作用

  • 為所有窗口分配Surface??蛻舳讼騑MS添加一個窗口的過程,其實就是WMS為其分配一塊Suiface的過程,一塊塊Surface在WMS的管理下有序的排布在屏幕上。Window的本質(zhì)就是Surface。
  • 管理Surface的顯示順序、尺寸、位置
  • 管理窗口動畫
  • 輸入系統(tǒng)相關(guān):WMS是派發(fā)系統(tǒng)按鍵和觸摸消息的最佳人選,當接收到一個觸摸事件,它需要尋找一個最合適的窗口來處理消息,而WMS是窗口的管理者,系統(tǒng)中所有的窗口狀態(tài)和信息都在其掌握之中,完成這一工作不在話下。

什么是Window

“Window”表明它是和窗口相關(guān)的,“窗口”是一個抽象的概念,從用戶的角度來講,它是一個“界面”;從SurfaceFlinger的角度來看,它是一個Layer,承載著和界面有關(guān)的數(shù)據(jù)和屬性;從WMS角度來看,它是一個WIndowState,用于管理和界面有關(guān)的狀態(tài)。

在《深入理解Android內(nèi)核設(shè)計思想》一書中看到一個比喻非常好,整個界面就像由N個演員參與的話劇:SurfaceFling是攝像機,它只負責(zé)客觀的捕捉當前的畫面,然后真實的呈現(xiàn)給觀眾;WMS就是導(dǎo)演,它要負責(zé)話劇的舞臺效果、演員站位;ViewRoot就是各個演員的長相和表情,取決于它們各自的條件與努力。可見,WMS與SurfaceFling的一個重要區(qū)別就是——后者只做與“顯示”相關(guān)的事情,而WMS要處理對輸入事件的派發(fā)。

Android支持的窗口類型很多,統(tǒng)一可以分為三大類,另外各個種類下還細分為若干子類型,且都在WindowManager.java中有定義。

  • Application Window
  • SystemWindow
  • Sub Window

解惑

Q:WMS是系統(tǒng)服務(wù),有SystemServer負責(zé)啟動,啟動時機相對較晚,那么在WMS運行之前,終端顯示屏就一團黑?

A:在WMS啟動之前,系統(tǒng)只需顯示開機動畫,它們都有特殊的方式來向屏幕輸出圖像,比如直接通過OpenGL ES與SurfaceFling的配合來完成。這也從側(cè)面告訴我們,要想在Android上顯示UI,并不一定要通過WMS。

AMS

基礎(chǔ)了解

作用

  • 統(tǒng)一調(diào)度所有應(yīng)用程序的Activity的生命周期
  • 啟動或殺死應(yīng)用程序的進程
  • 啟動并調(diào)度Service的生命周期
  • 注冊BroadcastReceiver,并接收和分發(fā)Broadcast
  • 啟動并發(fā)布ContentProvider
  • 調(diào)度task
  • 處理應(yīng)用程序的Crash
  • 查詢系統(tǒng)當前運行狀態(tài)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容