理解WindowManager和WMS

WindowManager

概念掃盲:

  • Window是界面的抽象概念,它是一個抽象類,實現(xiàn)類為PhoneWindow,它包含了view并對view進行管理。
  • WindowManager是管理window的,繼承自ViewManager,實現(xiàn)類為WindowManagerImpl,WindowManager會將具體的操作教給WMS處理,他們之間通過Binder通信
  • WMS實現(xiàn)WindowManager的方法,對WindowManager隱藏了部分接口,他們的關系類似于ActivityManager和AMS

繼承自ViewManager,后者具備addView,updateViewLayout,removeView三個操作view的方法,WIndowManager加入了Window類型和層級相關的常量。如getDefaultDisplay(),得知WM將當前window添加到哪個屏幕(Display)上了。removeViewImmediate(view)表示在這個方法返回前要執(zhí)行View.onDetachedFromWindow來完成傳入的view相關銷毀工作。

Activity綁定window過程
在activity.attach方法中,PhoneWindow生成,其持有activity的引用,同時通過window.setWindowManager方法傳入WindowManager,實際上是WindowManagerImpl,同時內部通過createLocalWindowManager將PhoneWindow傳入WindowManagerImpl,這樣就實現(xiàn)了window和WindowManager的雙向引用。

WindowManager通過持有window的引用而操作window,比如添加view,但WindowManager對window的操作是靠其成員變量WindowManagerGlobal實現(xiàn)的。

Window的屬性

1、類型和顯示次序
WMS是調度者,Window相當于員工,他們之間定義了一些協(xié)議(屬性),保存在WindowManager.layoutParams中。
窗口分為Application Window、Sub Window、System Window。
子窗口必須依附于其他窗口才能存在,比如popupWindow;系統(tǒng)輸入法窗口、Toast、音量窗口就屬于系統(tǒng)窗口。

窗口顯示次序的基本規(guī)則,是根據(jù)系統(tǒng)為窗口分配的Z軸次序。這個值是根據(jù)窗口的type確定的,type值越大值越靠前,就越靠近用戶。當然現(xiàn)實中計算情況比這個復雜。

2、window的標志
就是Flag,包括不接受觸摸事件,屏幕常亮、允許窗口在屏幕之外等屬性。同樣定義在WindowManager.layoutParams中。設置flag有三種方式,addFlag,setFlag和通過給WindowManager.layoutParams設置flag,然后通過addView方法進行添加。
eg:windowManager.addView(mTextView,mWindowLayoutParams);

3、軟鍵盤相關模式
包括調整軟件判大小,是否被隱藏之類的屬性??梢栽谇鍐挝募衋ctivity的android:windowSoftInput屬性添加或者通過java代碼中window.softInputMode屬性設置。

Window的操作

基本是addView、updateWindow、removeWindow三大操作。通過WindowManager調度,最終由WMS實現(xiàn)。對于WMS來說,三種類型的窗口添加過程是基本一致的。
一、下面看系統(tǒng)窗口statusBar添加過程:
1、通過StatusBarWindowManager.add方法添加
2、創(chuàng)建LayoutParams配置StatusBar的屬性,然后通過windowManger.addView方法將狀態(tài)欄添加。
2.1 WindowManager的addView方法最終是通過windowManagerImpl實現(xiàn)的,后面轉入WindowManagerGlobal。
2.2在WindowmanagerGlobal中,通過window的將需要添加的view添加到mVIews列表,窗口屬性添加到mParams列表,創(chuàng)建ViewRootImpl并添加到mRoots列表,最終ViewRootImpl.setView方法將窗口和窗口參數(shù)設置到ViewRootImpl中,可見我們添加窗口這一操作通過ViewRootImpl實現(xiàn)的。

ViewRootimpl有很多職責,其中包括

  • View的根并管理View樹
  • 觸發(fā)View的測量、布局和繪制
  • 事件的中轉站
  • 管理surface
  • 負責與WMS進行進程間通信

ViewRoot通過調用windowSession.addToDisplay方法——它是IWindowSession的binder客戶端對象——實現(xiàn)類在遠端Session,運行在WMS所在進程。
每個應用程序對應一個Session。WMS通過ArrayList保存這個Session。剩下的工作中,
遠端addToDisplay方法中調用WMS的addWindow方法,WMS為每個添加的窗口分配Surface,并確定窗口顯示次序——surface是真正負責顯示界面的,WMS將其管理的Surface交由SurfaceFlinger處理,后者將他們混合并繪制。

二、Activity的添加過程
和系統(tǒng)window的添加過程基本類似,在ActivityThread.handleresumeActivity方法中,在其中調用ViewManager的addView方法,不過第一個參數(shù)為DecorView,說明activity的窗口中會包含DecorView。

三、Window更新過程
類似于添加流程,在WindowManager中調用updatewindowLayout方法,實際會調用WindowManagerGlobal的updateViewLayout方法,其中刪除了原有的params,并重新添加,然后通過ViewRootImpl的setLayoutParams獎更新的參數(shù)設置到ViewRootImpl中,其中會經過performtraversals方法,使得Viewtree開始view的繪制流程。其中會通過relayoutWindow調用IWindowSession的relayout方法來更新window視圖,除此之外,還會分別調用performMeasure、performLayout、performDraw方法完成完成了view的繪制流程。

WMS

  • 窗口管理,負責窗口的啟動,添加和刪除。窗口的大小和層級也是WMS確定。窗口管理的核心成員有DisplayContent、WindowToken、WindowState,WMS對接WindowManager
  • 窗口動畫,動畫管理者為WindowAnimator
  • 輸入系統(tǒng)的中轉站,通過對窗口的觸摸產生的觸摸事件,InputManagerService會尋找最合適的窗口處理觸摸反饋信息,WMS作為輸入系統(tǒng)的中轉站。
  • Surface 管理 窗口并不具備繪制的功能。每個窗口都需要一塊surface來繪制,為每個窗口分配surface是WMS完成的,它會對接SurfaceFlinger

WMS是在SystemServer進程中創(chuàng)建的,它屬于官方系統(tǒng)中其他服務類。其中比較關鍵的成員變量有mSessions,其中成員類型為Session,每一個需要通過遠程通信和WMS進行window操作的客戶端都必須通過Session和WMS通信,每個應用程序進程都會對應一個Session。此外還有mWindowMap,繼承了HashMap,key類型為IBinder,value類型為WindowState,用來保存窗口信息,在WMS中它用來描述一個窗口。所以mWindowMap就是WMS中保存各種窗口的集合。

WIndow的添加過程(WMS處理部分)

無論是系統(tǒng)窗口還是activity,添加window過程中都會經過WMS的addWindow方法。
addWindow方法主要邏輯如下:對窗口進行權限等相關檢查;創(chuàng)建windowToken;將windowToken和WindowState相關聯(lián);創(chuàng)建和配置DisplayContent,完成窗口添加到系統(tǒng)前的準備工作。

Window的刪除過程

刪除從客戶端的removeView開始,
檢查刪除線程,如果不正確就拋出異常;
從ViewRootImpl列表、布局參數(shù)和View列表中刪除和該window相關的元素;
判斷是否可以直接進行刪除操作,如果不能就推遲刪除操作;
執(zhí)行遠端刪除操作,清理和釋放與window相關的一切資源,包括Session、對應的surfaceSession資源等。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容