天天看點

以android狀态欄虛拟按鍵消息為例學習在input系統插入按鍵消息的處理

以android狀态欄虛拟按鍵消息為例學習在input系統插入按鍵消息的處理

       最近在考慮不是本機硬體産生的按鍵消息怎麼在本機上轉化成硬體按鍵消息來處理,這個情況在實際應用中很常見,也很必要。從android4.0起,平闆電腦的systembar都是在平闆下方的位置有幾個按鍵,有傳回,MENU,RECENT,VOL+,VOL-。這些都是軟體圖示,點選這個圖示,SYSTEMUI就轉化出一個對應的按鍵消息post出去給系統,windowsmanager再做出相應的響應。那systemui又是怎麼處理的呢?

     筆者仔細跟了一下,在android4.2 SDK中對應的檔案為frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\policy\KeyButtonView.java,在這裡面提供了按鍵消息的轉化。關鍵核心代碼如下:

       可以看出,核心是先new一個消息對象,再通過InputManager對象的getInstance的injectInputEvent方法來強行插入一個消息,然後再做消息的派發。

在車機的應用中,按鍵消息一般都是用單片機來處理的,單片機處理好後通過序列槽給主要晶片。主要晶片的序列槽驅動一般都是标準的tty裝置,在實際的開發中我們一般不會在驅動中去截這個消息,因為一般來說這種序列槽互聯都帶有一定的控制消息,需要解析。通過序列槽得到的按鍵消息已經是一個确定的值,但是怎麼給應用呢?android對這種input消息已經有一套完整的處理,是以得按套路出牌,那我們就需要把它轉化成硬體按鍵消息。好在android很早就已經考慮到這種情況,是以我們可以使用injectInputEvent去插入一個消息。筆者根據上面的學習,也做了一些測試,确實可行。增加的調用測試代碼如下:

   SDK源碼裡有精華,仔細看看這些代碼還是有很多東西可學。