Android視窗管理(2) 訊息傳遞

2021-07-23 22:58:11 字數 3072 閱讀 6252

本文內容參考: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的真正實現類是viewrootimplviewroot通過與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.inputdevicereader

2.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...