Android-理解window和windowmanager


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等)


免責聲明!

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



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