一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

Android核心分析(15)--------Android輸入系統(tǒng)之輸入路徑詳解

 開花結(jié)果 2011-02-21
Android用戶事件輸入路徑
 
1 輸入路徑的一般原理
      按鍵,鼠標(biāo)消息從收集到最終將發(fā)送到焦點(diǎn)窗口,要經(jīng)歷怎樣的路徑,是Android GWES設(shè)計(jì)方案中需要詳細(xì)考慮的問題。按鍵,鼠標(biāo)等用戶消息消息的處理可分為不同的情況進(jìn)行判定:
(1)用戶輸入根據(jù)系統(tǒng)狀況是否應(yīng)該派送。如在ScreenOff的情況下,在按鍵屬于特殊按鍵的情況下等
(2)是否有攔截Listener
(3)對(duì)按鍵事件來講,是否存在輸入法
(4)是否是焦點(diǎn)終點(diǎn)
(5)是否為焦點(diǎn)切換按相關(guān)鍵
這些情況都是設(shè)計(jì)輸入路徑需要考慮的基本條件。
1.1一般的輸入路徑設(shè)計(jì)
該輸入路徑實(shí)際上是指的按鍵消息(MSG_KEYDOWN,MSG_KEYUP, MSG_LongPress)的輸入路徑,即從活動(dòng)主窗口到焦點(diǎn)窗口所經(jīng)歷的路程。
 inputNormal
將信息輸入路徑分為兩步:
Step 1)窗口管理器將信息發(fā)送到活動(dòng)窗口
Step 2)活動(dòng)窗口通過缺省處理函數(shù)將該消息一層層的傳遞到焦點(diǎn)。
這樣應(yīng)用程序可以在活動(dòng)View的處理函數(shù)中來預(yù)先處理用戶輸入信息,從而增強(qiáng)應(yīng)用對(duì)用戶信息的控制力。
 inputxxx1
傳遞路徑是通過View的缺省處理函數(shù)Onxxx來完成。通過ActiveView ->focus->focus->focus的鏈條關(guān)系,一級(jí)一級(jí)的將按鍵消息MSG_KEYDOWN,MSG_KEYUP, MSG_CHAR等傳遞到focus窗口。
 inputxxx2
此時(shí)用戶按鍵輸入先發(fā)送到輸入法窗口,經(jīng)過輸入法管理器處理,過濾后將輸入法產(chǎn)生的結(jié)果放置到焦點(diǎn)View。
1.3輸入系統(tǒng)整體流程
下面示意圖是Android輸入系統(tǒng)的數(shù)據(jù)流途徑,通過WM的輸入系統(tǒng)線程收集消息,分發(fā)到Focus Activity消息隊(duì)列,然后通過消息系統(tǒng)派發(fā)。
 InputSystemPATH
 
 
2 Android輸入路徑詳細(xì)描述
 
  2.1 第一步:用戶數(shù)據(jù)收集及其初步判定
     KeyInputQ在WindowMangerService中建立一個(gè)獨(dú)立的線程InputDeviceReader,使用Native函數(shù)readEvent來讀取Linux Driver的數(shù)據(jù)構(gòu)建RawEvent,放入到KeyQ消息隊(duì)列中。
 inputDeviceReader
preProcessEvent()@KeyInptQ@KeyInputQueue.java這個(gè)是在輸入系統(tǒng)中的第一個(gè)攔截函數(shù)原型。KeyQ重載了preProcessEvent()@WindowManagerService.java。在該成員函數(shù)中進(jìn)行如下動(dòng)作:
(1) 根據(jù)PowerManager獲取的Screen on,Screen off狀態(tài)來判定用戶輸入的是否WakeUPScreen。
(2) 如果按鍵式應(yīng)用程序切換按鍵,則切換應(yīng)用程序。
(3) 根據(jù)WindowManagerPolicy覺得該用戶輸入是否投遞。
2.2 第二步 消息分發(fā)第一層面
InputDispatcherThread從KeyQ中讀取Events,找到Window Manager中的Focus Window,通過Focus Window記錄的mClient接口,將Events專遞到Client端。
 inputDispatcherThread
如何將KeyEvent對(duì)象傳到Client端:
在前面的章節(jié)(窗口管理ViewRoot,Window Manager Proxy)我們已經(jīng)知道:在客戶端建立Window Manager Proxy后,添加窗口到Window Manager service時(shí),帶了一個(gè)跟客戶ViewRoot相關(guān)的IWindow接口實(shí)例過去,記錄在WindowState中的mClient成員變量中。通過IWindow這個(gè)AIDL接口實(shí)例,Service可以訪問客戶端的信息,IWindow是Service連接View橋梁。
 IWindow 看看在Client ViewRootKeyEvent的分發(fā)過程
IWindow:dispatchKey(event)
dispatchKey(event)@W@ViewRoot@ViewRoot.java
       ViewRoot.dispatchKey(event)@ViewRoot.java
                     message>
                     sendMessageAtTime(msg)@Handler@Handler.java
至此我們通過前面的Looper,Handler詳解章節(jié)的分析結(jié)論,我們可以知道Key Message已經(jīng)放入到應(yīng)用程序的消息隊(duì)列。
2.3第三步:應(yīng)用消息隊(duì)列分發(fā)
   消息的分發(fā),在Looper,Handler詳解章節(jié)我們分析了Looper.loop()在最后后面調(diào)用了handleMesage.
          …
           ActivityThread.main()
                Looper.loop()
                  ViewRoot$RootHandler().dispatch()
                      handleMessage
                          ....
      注意到在分發(fā)的調(diào)用msg.target.dispatch(),而這個(gè)target在第二層將消息sendMessageAtTime到消息隊(duì)列時(shí)填入了mag.target=this即為msg.target=ViewRoot實(shí)例。所有此時(shí)handleMessage就是ViewRoot重載的handleMessage函數(shù)。
       deliverkeyEvent
            如果輸入法存在,dispatchKey到輸入法服務(wù)。
     在這里需要強(qiáng)調(diào)的是,輸入法的KeyEvent的攔截并沒有放入到Window Manager Service中,而是放入到了客戶端的RootView中來處理。
2.4第四步:向焦點(diǎn)進(jìn)發(fā),完成焦點(diǎn)路徑的遍歷。

focuspath1

分發(fā)函數(shù)調(diào)用棧
mView.dispatchKeyEvent:mView是與ViewRoot相對(duì)應(yīng)的Top-Level View.如果mView是一個(gè)ViewGroup則分發(fā)消息到他的mFocus。
mView.dispatchKeyEvent @ViewGroup  (ViewRoot@root
               Event.dispatch
                        mFocus.dispatchKeyEevnet
    如果此時(shí)的mFocu還是一個(gè)ViewGroup,這回將事件專遞到下一層的焦點(diǎn),直到mFocus為一個(gè)View。通過這輪調(diào)用,就遍歷了焦點(diǎn)Path,至此,用戶事件傳遞完成一個(gè)段落。
2.5第五步 缺省處理
如果事件在上述Focus View沒有處理掉,并且為方向鍵之類的焦點(diǎn)轉(zhuǎn)換相關(guān)按鍵,則轉(zhuǎn)移焦點(diǎn)到下一個(gè)View。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    国产精品激情在线观看| 国产小青蛙全集免费看| 国产精品蜜桃久久一区二区| 亚洲熟女一区二区三四区| 欧美不卡高清一区二区三区| 欧美午夜一区二区福利视频| 欧美日韩国产综合特黄| 黄色片国产一区二区三区| 日韩人妻一区二区欧美| 91在线播放在线播放观看| 亚洲精品一区三区三区| 手机在线观看亚洲中文字幕| 尹人大香蕉一级片免费看| 亚洲精品国男人在线视频| 欧美日韩人妻中文一区二区| 日韩欧美精品一区二区三区| 久久99夜色精品噜噜亚洲av| 欧美在线视频一区观看| 亚洲午夜av一区二区| 91麻豆精品欧美一区| 欧美成人一区二区三区在线| 欧美在线观看视频免费不卡| 日韩在线视频精品视频| 国产午夜精品福利免费不| 欧美精品中文字幕亚洲| 少妇人妻精品一区二区三区| 日本精品中文字幕在线视频| 亚洲午夜av久久久精品| 亚洲免费视频中文字幕在线观看| 精品少妇人妻av免费看| 丰满少妇被粗大猛烈进出视频| 亚洲精品日韩欧美精品| 五月综合婷婷在线伊人| 亚洲中文字幕视频一区二区| 精品al亚洲麻豆一区| 国产一级不卡视频在线观看| 亚洲国产成人精品一区刚刚| 国产在线观看不卡一区二区| 欧美日韩有码一二三区| 中文字幕欧美精品人妻一区| 国产又大又硬又粗又湿|