上文中奸忽,我們已經(jīng)分析了IMS的啟動(dòng)甩骏,IMS啟動(dòng)的過(guò)程跑了兩個(gè)消息線程,一個(gè)分發(fā)消息線程肮街,一個(gè)讀取消息線程风题。當(dāng)AMS監(jiān)控到鍵盤(pán)輸入時(shí)間的時(shí)候,它應(yīng)該把監(jiān)控到的消息分發(fā)到用戶手上嫉父,而這個(gè)用戶就是應(yīng)用程序當(dāng)前激活的Activity窗口沛硅。那么IMS怎么發(fā)給Activity窗口,這其中肯定得建立一個(gè)通道绕辖。這樣當(dāng)IMS監(jiān)控到設(shè)備有內(nèi)容的時(shí)候摇肌,就通過(guò)這個(gè)通道分發(fā)到Activity窗口。
應(yīng)用程序Activity窗口和IMS之間的通道建立涉及關(guān)鍵點(diǎn):
1. 既將激活的Activity窗口會(huì)通知IMS仪际,當(dāng)鍵盤(pán)事件發(fā)生的時(shí)候围小,IMS就把鍵盤(pán)事件拋給Activity處理。
2. 應(yīng)用程序?yàn)锳ctivity窗口和IMS之間創(chuàng)建了一個(gè)鍵盤(pán)消息接收通道树碱,通道的一端由一個(gè)Server端的InputChannel構(gòu)成肯适,另一端由Client端的inputChannel構(gòu)成,Server端的InputChannel是注冊(cè)在IMS的InputDispatcher中赴恨,下圖mInputManager.registerInputChannel方法疹娶,而Client端的InputChannel是注冊(cè)在由應(yīng)用程序主線程的循環(huán)對(duì)象Looper中伴栓,下圖inputChannels[1].transferTo方法伦连。注冊(cè)在InputDispatcher中的inputChannel由一個(gè)反向管道的讀端和一個(gè)前向管道的寫(xiě)端組成,而注冊(cè)在應(yīng)用程序主線程的消息循環(huán)對(duì)象Looper中的InputChannel由這個(gè)前向管道的讀端和反向管道的寫(xiě)端組成钳垮。
3. 為應(yīng)用程序注冊(cè)了鍵盤(pán)消息接收通道惑淳,其中mInputChannel即為2步驟中的Client端的InputChannel通道。
這里創(chuàng)建前向管道的作用是當(dāng)InputDispatcher監(jiān)控到鍵盤(pán)消息的時(shí)候饺窿,前向管道寫(xiě)端(Server端InputManager)寫(xiě)入內(nèi)容歧焦,則前向管道讀端(Client 應(yīng)用程序)就被喚醒讀取內(nèi)容。而后向管道的作用是相反的,當(dāng)應(yīng)用程序(當(dāng)前激活的Activity窗口)處理完鍵盤(pán)消息的時(shí)候绢馍,告知InputManager消息處理完畢的時(shí)候會(huì)用到后向管道向瓷,通過(guò)后向管道的寫(xiě)端(Server端 應(yīng)用程序)寫(xiě)入內(nèi)容,則后向管道的讀端(Client InputManager)就喚醒讀取內(nèi)容舰涌。