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