1. 回顧

  • InputRead線程從輸入設(shè)備當(dāng)中得到輸入事件

  • 對(duì)于讀到輸入事件稍作處理,比如緊急事件,來電時(shí)候按下音量鍵便是靜音,這時(shí)候是直接處理的,處理之后再把輸入事件放入mInBoundQueue隊(duì)列當(dāng)中,接著喚醒Dispatch線程。

  • 對(duì)于Dispatch線程也是對(duì)輸入事件稍作處理之后,再給分發(fā)給應(yīng)用程序

    • Global Key/System Key:處理之后直接丟掉

    • User Key:上傳給應(yīng)用程序:通過查找目標(biāo)APP得到對(duì)應(yīng)connection,再把輸入事件放入某個(gè)outBoundQueue隊(duì)列中,應(yīng)用程序?qū)⑵淙〕鎏幚怼?/p>

2. 分發(fā)dispatch事件概述

在上一篇博文分析到在Dispatch線程當(dāng)中有一個(gè)Vector容器(mConnectionByFd),里面有多個(gè)connection,這些connection對(duì)應(yīng)著一個(gè)個(gè)應(yīng)用程序connection含有InputChannel(含有fd),應(yīng)用程序也含有對(duì)應(yīng)fd,fd通過socketpair機(jī)制得到。Dispatch線程找到對(duì)應(yīng)的connection之后,便可以將輸入事件寫入InputChannel中的fd中,應(yīng)用程序通過socketpair機(jī)制馬上便可以獲得fd。

3. 分發(fā)Dispatch過程

  • 查找目標(biāo)

    • 向WindowManagerService查詢當(dāng)前窗口

    • 獲得對(duì)應(yīng)的connection

  • 把輸入事件放入connection某個(gè)隊(duì)列outBoundQueue中

  • 從隊(duì)列中取出,構(gòu)造為InputMessage類型,逐個(gè)將輸入事件寫入fd中

4. 分發(fā)事件具體調(diào)用時(shí)序圖

Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

http://www.cnblogs.com/lkq1220/p/7218063.html