Calvin's Tech Space

          成于堅忍,毀于浮躁

             :: 首頁 :: 聯系 :: 聚合  :: 管理
          Android 窗口管理
          在整個控件樹的最頂端,是一個邏輯的樹頂,ViewParent,在源碼中的實現是ViewRoot(ViewRoot extends Handler implements ViewParent)。它是整個控件樹和WindowManager之間的事件信息的翻譯者。WindowManager是Android中一個重要的服務。它將用戶的操作,翻譯成為指令,發送給呈現在界面上的各個Window。Activity會將頂級的控件注冊到WindowManager中,當用戶真是觸碰屏幕或鍵盤的時候,WindowManager就會通知到,而當控件有一些請求產生,也會經由ViewParent送回到WindowManager中。從而完成整個通信流程。

          事件分發流程
          用戶在觸發一個時間后產生一個消息,消息先被window manager采集到,然后分發給client。
          window manager通過IWindow分發給client,我們知道ViewRoot使用IWindowSession與server通訊,使用IWindow接收消息,所以第一步消息到了ViewRoot這里來了
          也就是window manager->IWindow->ViewRoot
          到了ViewRoot后它把消息轉發給Looper(樓主可以看ViewRoot.java看它是怎么獲取當前線程的Looper的)
          Looper->ViewRoot$RootHandler().dispatch(),有轉發會給ViewRoot,然后就通過decor view形成的樹狀結構依次分發下去。

          window manager proxy中維護了view, ViewRoot, layout param三元組。
          每次調用window manager proxy的addView都會新增一個三元組。一般程序中都是調用addView(decor,...),也就是只對decor view調用addView

          *****************\
          在Activity在performLaunchActivity時,會使用Activity.attach()建立一個PhoneWindow主窗口。這個主窗口的建立并不是一個重點。handleResumeActivity真正要啟動一個Activity時候,將主窗口加入到WindowManager,當然并不是將主窗口本身,而是將主窗口的DecorView加入到WindowManager中。

          • performLaunchActivity@ActivityThread.java
          attach()@Activity.javaSession.java
          addWindow()@WindowManager

          mWindow = PolicyManager.makeNewWindow(this); --實例化一個activity或者dialog或者widget的地方才會make new window
          • handleResumeActivity()@ActivityThread.java
          addView()@WindowManagerImpl.java --添加DecorView到WindowManager中
          setView()@ViewRoot.java
          add()@IwindowSession.java
          | --這里通過AIDL調用
          add()@WindowManagerService$Service.java

          關于PhoneWindow:
          而PhoneWindow只是做了一個具體跟手機功能相關的公用事件的處理,所以在Android中PhoneWindow并不是一個抽象的純正概念,而是一個跟手機系統相關的一個特別窗口概念,例如按鍵的默認動作處理,按鍵音的發出等等。

          一個View對應一個ViewRoot

          問題:WindowMangerService如果通過AIDL將事件派發到客戶端的?
          posted on 2010-11-24 18:28 calvin 閱讀(2887) 評論(0)  編輯  收藏 所屬分類: Android
          主站蜘蛛池模板: 彭山县| 德阳市| 上饶市| 洞口县| 五台县| 晋中市| 嵊州市| 庆元县| 鄢陵县| 田阳县| 金沙县| 南城县| 扎兰屯市| 沁水县| 丹寨县| 横峰县| 综艺| 林州市| 巴林左旗| 宝坻区| 桂阳县| 木里| 呼伦贝尔市| 桓台县| 乌鲁木齐县| 福泉市| 延安市| 调兵山市| 宜君县| 札达县| 惠水县| 化州市| 沅陵县| 曲阜市| 鄄城县| 兰西县| 灵武市| 得荣县| 泗阳县| 刚察县| 东莞市|