青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

大龍的博客

常用鏈接

統計

最新評論

Android窗口管理(http://blog.csdn.net/huanxido/article/details/7879529)

一、 概述

在Android系統中,從設計的角度來看,窗口管理系統是基于C/S模式的。整個窗口系統分為服務端和客戶端兩大部分,客戶端負責請求創建窗口和使用窗口,服務端完成窗口的維護,窗口顯示等。

 


在Client端,并不是直接和 WindowManagerService交互,而是直接和本地對象WindowManager交互,然后由WindowManager完成和 WindowManagerService的交互。對于Android應用來說這個交互是透明的,應用不能感知到 WindowManagerService的存在

 



二、 窗口的定義

在android的應用框架中,窗口主要分為兩種:

第一種是應用窗口:一個activity有一個主窗口,彈出的對話框 也有一個窗口,Menu菜單也是一個窗口。在同一個activity中,主窗口、對話框、Menu窗口之間通過該activity關聯起來。和應用相關的 窗口表示類是PhoneWindow和Window,PhoneWindow繼承于Window,針對手機屏幕做了一些優化工作。PhoneWindow 只是一個窗口封裝類,里面核心的是mDecorView這個變量,mDecorView是一個頂層的View,窗口的添加就是通過調用 getDecorView()獲取到mDecorView并且調用WindowManager.addView()把該View添加到 WindowManager中。

第二種是公共界面的窗口:如最近運行對話框、關機對話框、狀態欄下拉 欄、鎖屏界面等。這些窗口都是系統級別的窗口,不從屬于任何應用,和activity沒有任何關系。這種窗口沒有任何窗口類來封裝,直接調用 WindowManager.addView()來把一個view添加到WindowManager中。

在應用初始化的時候,會首先生成一個Activity對象,此時該 activity還沒有屬于他的一個窗口。緊接著通過調用attach()函數,在attach()函數里面該activity會調用 PolicyManager.makeNewWindow()創建一個新的PhoneWindow,然后在activity的onCreate()生命周 期里,一般應用都會調用setContentView()設置該activity的顯示界面。在setContentView()里,框架會自動生成一個 布局,該布局文件包含了如標題欄、ActionBar等元素,最重要的是包含了應用的contentView。這個布局對應的就是PhoneWindow 里面的mDecorView。最后在activity將要顯示出來之前,通過getWindow().getDecorView()獲取到 DecorView,并通過WindowManager.addView()把DecorView添加到WindowManager中。


 

Activity添加客戶端窗口時序圖

 

 



三、  窗口管理

Android的窗關管理是基于C/S模式的,并且使用獨立進程的方 式實現。窗口管理的服務端WindowManagerService運行在獨立的進程system_server里,當應用程序需要創建窗口時,通過進程 通信的方式請求WindowManagerService創建窗口,由WindowManagerService向應用程序傳遞和窗口相關的交互消息。所 有程序的窗口都在服務端管理,窗口的顯示和控制都在WindowManagerService里處理。

WindowManagerService主要完成了以下幾部分功能:

1.      窗口的添加和刪除

2.      窗口的顯示和隱藏控制

3.      Z-order順序管理

4.      焦點窗口和焦點應用的管理

5.      輸入法窗口管理和墻紙窗口管理

6.      轉場動畫

7.      系統消息收集和分發

 

服務端的實現代碼是在/framework/base/services/java/com/android/server/wm/里,核心的幾個類是:

WindowManagerService.java

WindowState.java

WindowToken.java

AppWindowToken.java

Session.java

InputManager.java

InputMonitor.java

 

類解釋:

WindowManagerService負責完成窗口的管理工作;

WindowState和客戶端窗口一一對應,應用調用WindowManager.addView()時,最終會在WindowManagerService添加一個WindowState與之一一對應。

WindowToken是一個句柄,保存了所有具有同一個token 的WindowState。應用請求WindowManagerService添加窗口的時候,提供了一個token,該token標識了被添加窗口的歸 屬,WindowManagerService為該token生成一個WindowToken對象,所有token相同的WindowState被關聯到 同一個WindowToken。如輸入法添加窗口時,會傳遞一個mCurrToken,墻紙服務添加窗口時,會傳遞一個newConn.mToken。

AppWindowToken繼承于WindowToken,專門用 于標識一個Activity。AppWindowToken里的token實際上就是指向了一個Activity。 ActivityManagerService通知應用啟動的時候,在服務端生成一個token用于標識該Activity,并且把該token傳遞到應 用客戶端,客戶端的Activity在申請添加窗口時,以該token作為標識傳遞到WindowManagerService。同一個Activity 中的主窗口、對話框窗口、菜單窗口都關聯到同一個AppWindowToken。

Session表示一個客戶端和服務端的交互會話。一般來說不同的應用通過不同的會話來和WindowManagerService交互,但是處于同一個進程的不同應用通過同一個Session來交互。

InputManager和InputMonitor負責上層的消息分發功能。

 

WindowManagerService內部的幾個重要成員變量:

ArrayList<WindowState>         mWindows

HashMap<IBinder, WindowState>         mWindowMap

ArrayList<WindowToken>        mTokenList

ArrayList<AppWindowToken>         mAppTokens

 

mWindows保存了系統中所有的WindowState;

mWindowMap保存了每個WindowState和客戶端窗口的映射關系,客戶端應用請求窗口操作時,通過mWindowMap查詢到對應的WindowState;

mTokenList保存了所有的WindowToken

mAppTokens保存了所有的AppWindowToken


 


窗口管理服務端主要類圖

 

一個Activity從啟動到添加窗口的整個流程如下:

ActivityManagerService在接收到啟動 Activity請求時,首先生成一個token作為該Activity的唯一標識。然后調用WindowManagerService向其添加一個 AppWindowToken,此AppWindowToken封裝了Activity的token。接著AMS啟動應用客戶端進程并把token傳遞到 該進程,在客戶端進程里完成Activity的初始化。在Activity的attach()函數中,Activity完成PhoneWindow的創 建,并且把token傳遞給PhoneWindow。在Activity調用WindowManager.addView()時,在 WindowManager內部會把token和該View關聯,真正向WindowManagerService申請創建窗口的時候,再把token傳 遞給WindowManagerService。WindowManagerService接收到創建窗口的請求的時候,通過mTokenMap查詢對應 該token的AppWindowToken,如果為空則拋出異常,否則創建一個WindowState并完成初始化工作和其他數據結構的調整工作。在這 個過程中,token貫穿了服務端的AMS、WMS和客戶端的Activity、Window。

 


Activity啟動過程中創建窗口的時序圖

 



 

四、            WMS中服務端和客戶端的交互接口和數據結構

應用請求創建窗口時,和應用直接交互的是WindowManager 對象。WindowManager只是一個接口,調用addView()創建窗口時正真交互的是WindowManagerImpl對象。 WindowManagerImpl管理單個應用的所有本地窗口。應用調用addView()創建窗口時,WindowManagerImpl會生成一個 ViewRoot對象與之相對應,并且把相應的參數LayoutParams保存起來。

addView()的執行流程如下:

(1)    檢查所添加的窗口是否已經添加過,不允許重復添加;

(2)    如果所添加窗口為子窗口類型,找到其父窗口,并保存在內部變量中;

(3)    創建一個新的ViewRoot,并保存對應的View(DecorView)和LayoutParams;

(4)    調用ViewRoot的setView()方法,完成真正意義上的添加工作。

 

ViewRoot本質上是一個Handler,并且實現了ViewParent接口。ViewRoot的主要功能是:

1.      負責分發消息事件,如Key、Motion事件等;

2.      負責和WMS的交互,分發WMS的交互命令;

3.      作為DecorView的parent,對DecorView進行draw、measure、layout等操作;

 

在addView()的第3、4步完成之后,ViewRoot就全權接管了和WMS的交互工作,DecorView不需要做任何交互動作。ViewRoot和WMS之間的雙向對話,主要是通過以下兩個數據結構進行的:

IWindowSession

IWindow

這兩個數據結構都是標準的aidl接口,用于進程之間的同步通信。 IWindowSession負責ViewRoot到WMS的單向請求,IWindow則用于WMS回調ViewRoot。在ViewRoot對象內部, 存在著一個IWindowSession的靜態成員和一個IWindow的非靜態成員,所以一個進程里只有一個IWindowSession對象,但是可 以有多個IWindow對象。

Window、WindowManager、DecorView、ViewRoot、IWindowSession、IWindowSession、WindowState、WindowManagerService之間的關系可用下圖來表示:


 


 

在ViewRoot的構造函數中,調用 getWindowSession()初始化靜態成員sWindowSession和非靜態成員mWindow。在第4步調用setView()方法 時,ViewRoot會調用sWindowSession.add()方法,把IWindow添加到WMS中,WMS就會生成一個WindowState 與之一一對應,并且把IWindow對象保存到WindowState內部作為回調的接口。之后所有WMS的命令,都會通過直接訪問IWindow接口, 以消息的形式分發到ViewRoot,ViewRoot來完成相應的處理,或對DecorView進行操作,或完成后通過sWindowSession報 告給WMS。

 

 

一個窗口從添加到顯示可用以下時序圖表示:

 

 


  窗口添加過程時序圖

 

 

 


到此為止,整個窗口管理系統整體架構可表示如下:


 

窗口管理系統整體架構圖

 

 

 

五、            WindowState和Surface

 

從Client端調用WindowManager的 addView()方法到WMS完成WindowState的初始化,在這整個過程中,只是完成了一個窗口數據結構的創建,也就是說,到現在為 止,Client端的窗口和Server端的窗口已經建立了一種相對固定的連接關系,并且Client端和Server端之間能夠正常通信,WMS能夠透 明的對Client端的窗口進行操作,同時WMS也能夠接收Client端窗口的命令,對WindowState進行相應的調整。

一個WindowState想要顯示在屏幕上,必須申請一個顯示緩 存,這個顯示緩存的管理和維護是在底層圖形模塊實現的,在java層有一個操作的封裝對象Surface。WindowState申請到Surface對 象之后,會將此Surface對象的相關數據拷貝到Client端的ViewRoot中,ViewRoot中也維護了一個Surface對象,實際上這兩 個對象是指向同一塊顯示緩存。ViewRoot有了這塊顯示緩存的引用之后,即可以通過lockCanvas來獲取繪畫畫布,繪制完畢之后通過 unlockAndPostCanvas來將繪制內容刷新到顯示緩存中。也就是說,Client端窗口和Server端窗口共用一個 Surface,Client負責繪制Surface的內容,Server負責控制Surface在屏幕上的大小位置等。

ViewRoot通過IWindowSession的 relayout()接口來向WMS發送請求命令,包括窗口的顯示和隱藏,窗口的布局信息如位置大小,同時還會接收WMS的處理結果。WMS會根據屏幕大 小和Client請求的布局參數來決定窗口最終的布局信息,同時也會根據Client請求的顯示隱藏命令來返回一個有效的或者無效的Surface對象。 通常一個窗口的顯示過程為:

1.      Client請求顯示窗口,并且傳遞布局參數;

2.      WMS根據布局參數,申請一個Surface對象并返回給Client;

3.      Client對Surface進行繪畫操作,完成后告訴WMS;

4.      WMS將Surface顯示在屏幕上,并且進行層級等相應調整;

 


 

窗口顯示過程時序圖

 

一個橫跨Activity、View、ViewRoot、IWindowSession、IWindow、WindowState、WindowManagerService、Surface的整體概念如下如所示:


窗口管理系統完整架構圖

posted on 2013-01-14 09:26 大龍 閱讀(943) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美国产日韩免费| 欧美专区在线| 久久久久一区| 欧美激情国产高清| 亚洲色无码播放| 国产精品二区影院| 亚洲午夜激情在线| 久久精品国产999大香线蕉| 欧美日韩免费在线| 国内自拍亚洲| 欧美激情一区二区三区不卡| 亚洲一区二区三区精品视频| 亚洲第一综合天堂另类专| 亚洲在线免费观看| 激情久久久久| 欧美在线不卡| 久久蜜桃精品| 国产欧美另类| 黄色在线一区| 亚洲综合二区| 久久综合久久综合这里只有精品| 宅男精品导航| 亚洲国产女人aaa毛片在线| 欧美在线一级va免费观看| 久久爱www.| 欧美一级免费视频| 最近中文字幕日韩精品 | 国产精品hd| 国产精品欧美日韩一区| 国内外成人在线| 久久精品72免费观看| 久久久久99| 欧美日韩一区二区三区在线| 好看的日韩av电影| 一本色道**综合亚洲精品蜜桃冫| 香蕉久久夜色精品国产使用方法| 欧美日韩视频在线观看一区二区三区| 国产婷婷成人久久av免费高清| 亚洲激情成人网| 欧美资源在线| 亚洲美女在线观看| 另类成人小视频在线| 欧美一二三区精品| 欧美日本韩国| 91久久精品国产91久久| 久久大香伊蕉在人线观看热2| 亚洲国产高潮在线观看| 久久岛国电影| 午夜精品久久久久久久男人的天堂 | 亚洲国产成人久久综合一区| 欧美一区二区三区日韩| 国产精品久久波多野结衣| 亚洲清纯自拍| 欧美成人午夜激情在线| 久久国产精品久久久久久| 国产精品久久久久91| 日韩一区二区电影网| 欧美激情一区二区| 另类av导航| 亚洲高清中文字幕| 欧美aa国产视频| 久久亚洲精品一区二区| 精品成人在线| 免费中文日韩| 亚洲一二区在线| 欧美午夜精品伦理| 亚洲午夜一区二区| 99在线观看免费视频精品观看| 欧美精品一区二区久久婷婷| 亚洲精品国产系列| 亚洲毛片av| 欧美视频一区二| 亚洲欧美中文字幕| 亚洲综合精品一区二区| 国产欧美日韩视频一区二区三区| 欧美一区二区在线播放| 性色一区二区三区| 悠悠资源网亚洲青| 亚洲国产高潮在线观看| 欧美日韩国产一区二区| 亚洲欧美综合一区| 欧美一区在线视频| 在线观看一区二区精品视频| 亚洲国内自拍| 国产精品高清在线观看| 亚洲女ⅴideoshd黑人| 国产精品v欧美精品v日本精品动漫| 亚洲一区二区三区四区中文| 亚洲欧美电影院| 在线成人激情视频| 亚洲国产婷婷| 国产精品激情偷乱一区二区∴| 欧美影院精品一区| 另类春色校园亚洲| 亚洲欧美经典视频| 久久精品综合一区| 中文日韩电影网站| 久久久久久久成人| 国产精品99久久99久久久二8 | 日韩午夜在线| 亚洲综合成人在线| 亚洲三级影片| 亚洲主播在线| 亚洲黄色免费电影| 亚洲欧美资源在线| 亚洲精品乱码久久久久久久久| 中文高清一区| 亚洲国产mv| 亚洲欧美在线播放| 9色精品在线| 午夜精品一区二区在线观看 | 韩日欧美一区二区| 亚洲激情国产| 黄色成人在线免费| 一区二区精品国产| 亚洲精品国产精品乱码不99按摩| 亚洲欧美日韩国产成人| 999亚洲国产精| 久久漫画官网| 狠狠操狠狠色综合网| 99国产精品久久久久久久成人热| 亚洲高清网站| 久久久女女女女999久久| 西西人体一区二区| 欧美日韩综合精品| 亚洲美女视频在线免费观看| 亚洲欧洲精品一区二区三区不卡| 欧美aaaaaaaa牛牛影院| 国产在线精品自拍| 欧美一级艳片视频免费观看| 亚洲女人天堂成人av在线| 欧美精品三级日韩久久| 91久久精品日日躁夜夜躁欧美 | 亚洲卡通欧美制服中文| 久久网站免费| 免费欧美日韩| 一区久久精品| 久久另类ts人妖一区二区| 久久一区国产| 一区一区视频| 久久久亚洲成人| 国内精品免费在线观看| 欧美在线亚洲综合一区| 国产精品卡一卡二| 亚洲无吗在线| 欧美一区二区成人6969| 国产精品热久久久久夜色精品三区| 一本高清dvd不卡在线观看| 一区二区三区色| 国产精品成人观看视频免费 | 久久国产欧美| 久久亚洲免费| 在线国产亚洲欧美| 免费成人激情视频| 亚洲精品孕妇| 亚洲欧美日韩视频二区| 国产精品有限公司| 久久aⅴ国产欧美74aaa| 嫩草影视亚洲| 99精品欧美一区二区蜜桃免费| 欧美日韩精品一区二区三区四区 | 91久久精品一区二区别| 一区二区日韩伦理片| 国产精品你懂的在线| 性做久久久久久| 免费久久久一本精品久久区| 亚洲韩国青草视频| 欧美深夜福利| 亚洲高清一区二区三区| 日韩小视频在线观看| 欧美日韩在线影院| 亚洲欧美日韩爽爽影院| 久久中文精品| 日韩写真视频在线观看| 国产精品午夜春色av| 久久久久久精| 亚洲激情成人网| 欧美怡红院视频| 亚洲丶国产丶欧美一区二区三区| 欧美二区在线| 亚洲欧美日韩综合aⅴ视频| 欧美h视频在线| 亚洲免费在线播放| 精品成人一区二区三区四区| 欧美日韩精品免费观看视频完整| 久久av二区| 99精品视频免费全部在线| 久久欧美肥婆一二区| 亚洲精品一区二区三区av| 国产精品一区二区三区久久| 免费毛片一区二区三区久久久| 夜夜狂射影院欧美极品| 久久视频精品在线| 亚洲视频大全| 亚洲电影免费观看高清完整版在线 | 欧美激情中文字幕在线| 亚洲欧美自拍偷拍| a91a精品视频在线观看| 亚洲国产精品高清久久久| 久久九九国产精品怡红院|