2InputManagerService 從名稱(chēng)可以理解柠新,輸入管理服務(wù)
談到Service窗价,特別系統(tǒng)的Service冈涧,啟動(dòng)就是SystemServer。
一拍顷、初始化
java層
流程圖詳解
1抚太、初始化,在SystemServer 調(diào)用在startOtherService 中初始化的InputManagerService
2、初始化過(guò)程中尿贫,分別初始化了InputManagerHandler电媳,調(diào)用Jni 的 nativeInit,
這里的關(guān)注點(diǎn)是 傳入了DisplayThread的 Looper帅霜,其實(shí)就是用它的Messagequeue匆背。傳入native 層,接受處理事件身冀。
Native 層的初始化
流程圖詳解
1钝尸、Jni 中初始化,mPtr 就是 NativeInputManager搂根,同樣對(duì)應(yīng)參數(shù)傳入
2珍促、NativeInpuManager 初始化InputManager 對(duì)應(yīng)的是(流程圖C_+名稱(chēng),表示是C++ 代碼)
3剩愧、InputManager 初始化 InputDispatcher 以及InputReader猪叙,派發(fā),以及讀取仁卷。
到這里穴翩,大概的初始化流程就結(jié)束了
二、啟動(dòng)
啟動(dòng)流程
啟動(dòng)還是有SystemServer發(fā)出
流程圖簡(jiǎn)要說(shuō)明
1锦积、這里只需關(guān)注nativeStart(mPtr)芒帕,上文有提到mPtr? ->NativeInputManager。
2丰介、就是把InputDispatcher 以及InputReader run起來(lái)
? ? ? run 不禁會(huì)想到線(xiàn)程背蟆。對(duì)這里是線(xiàn)程,但I(xiàn)nputDispatcher 哮幢、InputReader 并不是線(xiàn)程對(duì)象带膀。
? ?InputDispatcher? 對(duì)應(yīng)?InputDispatcherThread ,InputReader? 對(duì)應(yīng)InputReaderThread?
? ?在初始化InputManager的時(shí)候 橙垢,線(xiàn)程開(kāi)始創(chuàng)建的初始化的垛叨。(run 其實(shí)調(diào)用的線(xiàn)程的run)
讀取事件流程
流程圖簡(jiǎn)要說(shuō)明
1、這里兩個(gè)線(xiàn)程就工作了柜某,啟動(dòng)線(xiàn)程時(shí)會(huì)不斷的調(diào)用線(xiàn)程的threadLoop()函數(shù)嗽元,直到其返回false則停止。實(shí)際上莺琳,Android系統(tǒng)mDispatcherThread&mReaderThread的threadLoop()函數(shù)都是反饋true,所以這兩個(gè)線(xiàn)程一旦開(kāi)機(jī)便不會(huì)停止载慈。
2惭等、processEventsForDeviceLocked,是處理key 事件的办铡,后面交給InputDevice 處理辞做,InputDevice琳要,可以理解輸入設(shè)備,終端有各種輸入設(shè)備秤茅。
3稚补、InputDevice,又讓InputMapper? 處理框喳。
InputDevice课幕,InputMapper? 是什么時(shí)候創(chuàng)建的,關(guān)系是什么五垮?
先講下InputDevice 的由來(lái)
時(shí)序圖簡(jiǎn)要說(shuō)明
1乍惊、可以看出,addDevice 同樣是通過(guò)讀取底層事件上報(bào)放仗,來(lái)添加润绎,刪除沒(méi)有標(biāo)出,流程與add 一致诞挨。
2莉撇、在createDeviceLocked,中惶傻,分別創(chuàng)建了InputDevice棍郎,InputMapper,device 放入集合保存达罗,管理
? ? ?device->addMapper(new KeyboardInputMapper(device, keyboardSource, keyboardType));
? ? mapper add 到? device中坝撑。add,說(shuō)明也是個(gè)集合粮揉。
InputMapper 有很多子類(lèi)巡李,KeyboardInputMapper,SingleTouchInputMapper扶认,MultiTouchInputMapper侨拦,這里不一一舉例。
讀取怎么分發(fā)辐宾?
?時(shí)間讀取到了狱从,那又和上文提到的Dispatcher 有什么關(guān)系哩?
時(shí)序圖簡(jiǎn)要說(shuō)明
1叠纹、getListener->notifyKey,如時(shí)序圖的備注季研,事件都會(huì)加入一個(gè)隊(duì)列。
2誉察、readThread 每次循環(huán)都會(huì) flush与涡,把事件發(fā)出去,
? ? ? 看代碼就是mInnerListener->InputDispatcher?
在初始化 InputReader的時(shí)候,初始化 傳的就是InputListenerInterface驼卖。
? ? ? InputDispatcher 實(shí)現(xiàn)了InputDispatcherInterface
? ? ? ?InputListenerInterface 繼承了 InputListenerInterface
? ? ? 最后會(huì)調(diào)用 InputDispatcher 的notifyKey
盜圖一張
上圖氨肌,在InputMapper 中處理事件的時(shí)候,EV_* 代表的含義酌畜。
以上怎囚,InputReader,就告一段落了桥胞。恳守,后面繼續(xù)分析InputDispatcher的? 過(guò)程。