<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                上一節講述了輸入事件的源頭是位于/dev/input/下的設備節點,而輸入系統的終點是由WMS管理的某個窗口。最初的輸入事件為內核生成的原始事件,而最終交付給窗口的則是KeyEvent或MotionEvent對象。因此Android輸入系統的主要工作是讀取設備節點中的原始事件,將其加工封裝,然后派發給一個特定的窗口以及窗口中的控件。這個過程由InputManagerService(以下簡稱IMS)系統服務為核心的多個參與者共同完成。 輸入系統的總體流程和參與者如圖5-1所示。 :-: ![](http://img.blog.csdn.net/20150814132642439?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center) 圖 5-1 輸入系統的總體流程與參與者 圖5-1描述了輸入事件的處理流程以及輸入系統中最基本的參與者。它們是: - Linux內核,接受輸入設備的中斷,并將原始事件的數據寫入到設備節點中。 - 設備節點,作為內核與IMS的橋梁,它將原始事件的數據暴露給用戶空間,以便IMS可以從中讀取事件。 - InputManagerService,一個Android系統服務,它分為Java層和Native層兩部分。Java層負責與WMS的通信。而Native層則是InputReader和InputDispatcher兩個輸入系統關鍵組件的運行容器。 - EventHub,直接訪問所有的設備節點。并且正如其名字所描述的,它通過一個名為getEvents()的函數將所有輸入系統相關的待處理的底層事件返回給使用者。這些事件包括原始輸入事件、設備節點的增刪等。 - InputReader,I是IMS中的關鍵組件之一。它運行于一個獨立的線程中,負責管理輸入設備的列表與配置,以及進行輸入事件的加工處理。它通過其線程循環不斷地通過getEvents()函數從EventHub中將事件取出并進行處理。對于設備節點的增刪事件,它會更新輸入設備列表于配置。對于原始輸入事件,InputReader對其進行翻譯、組裝、封裝為包含了更多信息、更具可讀性的輸入事件,然后交給InputDispatcher進行派發。 - InputReaderPolicy,它為InputReader的事件加工處理提供一些策略配置,例如鍵盤布局信息等。 - InputDispatcher,是IMS中的另一個關鍵組件。它也運行于一個獨立的線程中。InputDispatcher中保管了來自WMS的所有窗口的信息,其收到來自InputReader的輸入事件后,會在其保管的窗口中尋找合適的窗口,并將事件派發給此窗口。 - InputDispatcherPolicy,它為InputDispatcher的派發過程提供策略控制。例如截取某些特定的輸入事件用作特殊用途,或者阻止將某些事件派發給目標窗口。一個典型的例子就是HOME鍵被InputDispatcherPolicy截取到PhoneWindowManager中進行處理,并阻止窗口收到HOME鍵按下的事件。 - WMS,雖說不是輸入系統中的一員,但是它卻對InputDispatcher的正常工作起到了至關重要的作用。當新建窗口時,WMS為新窗口和IMS創建了事件傳遞所用的通道。另外,WMS還將所有窗口的信息,包括窗口的可點擊區域,焦點窗口等信息,實時地更新到IMS的InputDispatcher中,使得InputDispatcher可以正確地將事件派發到指定的窗口。 - ViewRootImpl,對于某些窗口,如壁紙窗口、SurfaceView的窗口來說,窗口即是輸入事件派發的終點。而對于其他的如Activity、對話框等使用了Android控件系統的窗口來說,輸入事件的終點是控件(View)。ViewRootImpl將窗口所接收到的輸入事件沿著控件樹將事件派發給感興趣的控件。 簡單來說,內核將原始事件寫入到設備節點中,InputReader不斷地通過EventHub將原始事件取出來并翻譯加工成Android輸入事件,然后交給InputDispatcher。InputDispatcher根據WMS提供的窗口信息將事件交給合適的窗口。窗口的ViewRootImpl對象再沿著控件樹將事件派發給感興趣的控件。控件對其收到的事件作出響應,更新自己的畫面、執行特定的動作。所有這些參與者以IMS為核心,構建了Android龐大而復雜的輸入體系。 Linux內核對硬件中斷的處理超出了本書的討論范圍,因此本章將以IMS為重點,詳細討論除Linux內核以外的其他參與者的工作原理。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看