1.window和windowmanager的關系
window是一個抽象類,具體實現為phoneWindow。創建一個window可以通過windowmanager來實現。
window的具體實現在windowManagerService中。
windowManager和windowManagerService的交互是一個IPC過程。
2.windowManager.LayoutParams中flags與type
flags表示window的屬性:
FLAG_NOT_FOCUSABLE 表示不需要獲得焦點,最終事件會傳遞給下層具有焦點的window
FLAG_NOT_TOUCH_MODEL 當前window區域的自己處理,區域之外的傳遞給底層的window
FLAG_SHOW_WHEN_LOCKED 可以讓window顯示在鎖屏的界面上
type有三種:
應用window — activity 層級1-99
子window — dialog等 層級 1000-1999
系統window — toast,系統狀態通知欄 層級2000-2999 需要權限,可以用TYPE_SYSTEM_OVERLAY或者TYPE_SYSTEM_ERROR
用法:
mLayoutParams.flags = LayoutParams.xxxx
mLayoutParams.type = LayoutParams.xxxx
mWindowManager.addview(xx,mLayoutParams)
3.windowManager提供的功能
addView 添加view
updateViewLayout 更新view
removeView 刪除view
4.addView工作機制
windowManager也是一個接口,真正實現在windowManagerIpml,然后用windowManagerGlabal處理。
windowManagerGlabal的實現過程:
1)檢查參數是否合法,若是子window那個要調整一些布局參數
2)創建viewRootImpl並將view添加到列表
3)通過viewRootImpl來更新界面並完成window的添加過程
5.removeView工作機制
跟addView一樣,用windowManagerGlabal實現,通過viewRootImpl完成刪除。
在windowManager中有同步和異步刪除兩種方法,一般不用同步,異步removeView是通過viewRootImpl的die方法發送一個請求刪除的信息,最終刪除在viewRootImpl的Handler中的dodie方法,實際用dispatchDetachedFromWindow完成刪除
6.updateViewLayout 工作機制
用windowManagerGlabal,通過viewRootImpl的serLayoutParams更新layout,最終通過windowManagerService的relayoutWindow完成實現
7.activity的window創建過程
1)如果沒有DecorView,那么創建它
2)將view添加到DecorView的mContentParent中
3)回調activity的onContentChanged方法通知activity視圖已經發生改變
8.Dialog的window創建過程
1)創建window
2)初始化DecorView並將dialog的視圖添加到DecorView中
3)將DecorView添加到window中並顯示
注:普通的dialog要使用activity的context,application的context會報錯,解決方法是可以將其指定為系統window並添加權限
9.toast的window創建過程
通過toast中TN的show和hide來完成顯示和隱藏,這兩個方法被NMS以跨進城的方式調用,內部分別是handleShow和handleHide
10.一個應用中到底有多少個window呢?
答案:應用window的個數(activity)+子window的個數(dialog等)+系統window的個數(toast等)