InputManagerService淺析

概述

InputManagerService構(gòu)造時會構(gòu)造naive的binder server inputManager。此處會創(chuàng)建inputReader和inputDispatcher兩條死循環(huán)線程。
inputReader利用inotify機制監(jiān)聽/dev/input下的設(shè)備節(jié)點增刪(最終也是 通過將inotify創(chuàng)建的fd掛到epoll下實現(xiàn)的),獲取到新增的節(jié)點后,利用epoll監(jiān)聽這些設(shè)備節(jié)點的rawEvent。
監(jiān)聽到這些rawEvent后會通過xxxMapper將其加工為xxxArgs,再轉(zhuǎn)發(fā)給監(jiān)聽者inputDispatcher。
inputDispatcher收到后只是做完簡單的事件有效性判斷后就往mInboundQueue中塞。
inputDispatcher線程就是循環(huán)讀取mInboundQueue看是否有數(shù)據(jù),有數(shù)據(jù)則開始分發(fā)。分發(fā)時先找到事件可以派發(fā)的窗口,該過程會涉及anr的判斷,再將事件塞到connection.outboundqueue中,再通過socket傳給app,再將事件塞到waitQueue中,等app處理完事件回調(diào)過來再將waitQueue中的事件刪除。

代碼分析的入口在InputManagerService#start


Image.png

一些重要的類和概念

InputReader
https://blog.csdn.net/zhzhangnews/article/details/91490097

InputDispatcher
https://blog.csdn.net/zhzhangnews/article/details/106795348

InputDispatcher的實現(xiàn)主要涉及3個Queue: 1. InboundQueue: 這個隊列里面存儲的是從InputReader送來到輸入事件 2. OutboundQueue:這個隊列里面存儲的是即將要發(fā)送給應(yīng)用的輸入事件 3. WaitQueue:這個隊列里面存儲的是已經(jīng)發(fā)給應(yīng)用的事件,但應(yīng)用還未處理完成。(OutboundQueue和WaitQueue在存在于Connection中)

InputChannel:本質(zhì)上是一對SocketPair


image.png

ACTION_CANCEL

case1:

viewGroup中有一個btn,在viewGroup中攔截第一次move事件。btn會收到一個CANCEL事件且不會收到后續(xù)事件.

如果某一個子View處理了Down事件(此時 mFirstTouchTarget不為null),那么隨之而來的Move和Up事件也會交給它處理。但是交給它處理之前,父View還是可以攔截事件的,如果攔截了事件,那么子View就會收到一個Cancel事件,并且不會收到后續(xù)的Move和Up事件

https://blog.csdn.net/cufelsd/article/details/89471402

case2:

正在往window1不斷派發(fā)事件如MOVE事件,此時按home鍵,window1會受到CANCEL事件。

原因:當焦點窗口變化時surfaceFlinger會調(diào)用到InputDispatcher::setInputWindowsLocked

Image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容