本文內容參考:android 核心分析(13) —–android gwes之android視窗管理window
是頂級的視窗概念,而activity
中的decorview
則是視窗中的頂級view
,建立activity
時,decorview
會attach到activity
的視窗中,同時也被加入到windowmanager
中,windowmanager
使用windowstate
與該view
相對應。
兩者之間通過建立session會話進行通訊,而這裡的session採用的還是android中最重要的ipc方式——aidl。activity
在建立視窗後需要將該視窗註冊到windowmanager
中,這個過程涉及到在activity
本地建立乙個windowmanager
的**,activity
通過這個**和遠端windowmanager
進行會話,會話的通道是iwindowsession
,本質上就是乙個aidl通訊過程。
會話是雙向的,為了將訊息傳送給對應的window
,windowmanager
通過iwindow
介面將對應的訊息傳送給window
端對應的處理函式。
viewroot
viewroot
的真正實現類是viewrootimpl
。viewroot
通過與windowmanager
進行通訊完成addview
以及訊息下發。
viewroot
通過iwindowsession
將視窗加入到windowmanager
中。
windowmanager
通過iwindow
介面下發事件到activity
。
所以viewroot
其實本質上是乙個handler
,用於接收訊息並處理訊息。
activity
利用getsystemservice
來獲取windowmanagerimpl
例項,而這個例項實際上就是windowmanager
在客戶端本地的**:
wm=(windowmanagerimpl)context.getsystemservice(context.window_service);
之後再呼叫addview
介面通過windowmanagerimpl
將視窗新增到windowmanager
中。在addview
的過程中,windowmanagerimpl
會建立起view
,layout
,viewroot
之間的對應關係,然後利用iwindowsession
傳遞給windowmanager
。
windowmanager
是服務端管理視窗的元件,它管理的是各個應用的頂級視窗,也即decorview
。將所有的視窗歸置到乙個統一的系統服務windowmanagerservice
管理是android系統的設計思想,這樣的機制並不難理解,系統總要有乙個總管各個視窗的管家嘛,總不能任其自生自滅。windowmanagerservice
的主要工作包括:
window service大體上實現了如下的功能:,
在服務端視窗物件叫作windowstate
,server端維護乙個mwindow
,其實就是乙個按z-order排序的視窗陣列。mwindowmap
用於記錄focuswindow活動視窗如何計算
原理其實很簡單,首先找到前台應用,然後根據mwindow
找到z-order順序中第一位次的視窗,該視窗就是活動視窗。
為什麼要提出token這個概念下面再來說一下windowmanager
的系統訊息收集與分發過程。windowmanagerservice
在內部維護了乙個keyq
的訊息佇列,同時還有兩個執行緒:
1.inputdevicereader2.inputdispatcherthread
inputdevicereader
使用native函式readevent
從driver中讀取rawevent
並放到keyq
佇列中。
inputdispatherthread
負責從keyq
佇列中讀取事件,並在windowmanager
找到對應的視窗,利用該視窗的iwindow
介面下發事件。
android視窗管理
mwindowmanager windowmanager context.getsystemservice context.window service window w policymanager.makenewwindow mcontext mwindow w dialog 中的一點原始碼 ov...
Android視窗管理
總覽 在android中,視窗的管理系統是基於c s模式的。其中,客戶端負責請求建立視窗 使用視窗,而服務端則完成視窗的維護 顯示。如圖所示,在client端,並不是直接與wms互動,而是通過本地物件windowmanager,然後由windowmanager完成和wms的互動。對於android應...
子視窗控制項 2 之訊息處理
通知碼進一步給出每條訊息的意思,下面是按鈕的通知碼的可能值。按鈕通知碼識別符號 值 bn clicked 0bn paint 1bn hilite或bn pushed 2bn disable 3bn disable 4bn doubleclicked或bn dblclk 5bn setfocus 6...