Android-理解window和windowmanager

1.window和windowmanager的關係app

window是一個抽象類,具體實現爲phoneWindow。建立一個window能夠經過windowmanager來實現。異步

window的具體實如今windowManagerService中。ide

windowManager和windowManagerService的交互是一個IPC過程。佈局

 

2.windowManager.LayoutParams中flags與typespa

flags表示window的屬性:接口

FLAG_NOT_FOCUSABLE 表示不須要得到焦點,最終事件會傳遞給下層具備焦點的window事件

FLAG_NOT_TOUCH_MODEL 當前window區域的本身處理,區域以外的傳遞給底層的windowrem

FLAG_SHOW_WHEN_LOCKED 能夠讓window顯示在鎖屏的界面上同步

type有三種:it

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

相關文章
相關標籤/搜索