天天看點

Android的鍵盤事件處理流程學習

Android的鍵盤事件處理流程學習

<?xml:namespace prefix = o />

type

:

文字博文

topic

:

Android 應用程式開發經驗

contest logo

:

第二屆 Google 暑期大學生部落格分享大賽

-

2011 Android 成長篇

Android的鍵盤事件處理流程學習
1. 基本流程      

1

)

核心處理按鍵,通過裝置檔案的方式提供給framework層

2

)

framework層的KeyInputQueue

.

java啟動線程從裝置檔案中讀出鍵碼,然後把讀出的鍵碼按kl檔案轉成相應鍵值

(

JNI調用EventHub

.

cpp

)

,最後寫入事件隊列

      ps

:

讀取鍵盤具體應該是eventHub類處理

3

)

framework層的WindowManagerService

.

java啟動線程從事件隊列中讀出鍵值,然後根據目前focus分發給相應視窗

      ps

:

剛才是 讀 鍵碼,現在是鍵值。

4

)

UI通過KeyCharacterMap

.

java處理kcm規則将使用者基本按鍵與功能鍵

(

Shift

,

Alt等

)

組合,得出最終按鍵

2. 兩個配置檔案

通常更換一種新的硬體,可能其鍵盤布局及鍵碼與标準版本不同,不用更改代碼,隻要修改以下配置檔案即可(如果增加新的未定義功能的按鍵,則需要修改代碼)

      1

)

xxx

.

kl

      a

)

代碼位置

      sdk

/

emulator

/

keymaps

/

kl結尾檔案

(

2.2版本模拟器使用

)

      b

)

功能

      硬體全鍵盤的鍵碼與鍵值的對應規則檔案(如0x21對應A)

      2

)

xxx

.

kcm

      a

)

代碼位置

      sdk

/

emulator

/

keymaps

/

kcm結尾檔案

(

2.2版本模拟器使用

)

      b

)

功能

      硬體全鍵盤的鍵值對應表(如按下Alt

,

Shift時按鍵對應的鍵值)

           PS:又提到kl

..

kcm前面來自驅動層,kcm這裡有組合鍵,還有home

.. 3. 整個流程相關代碼         

1

)

frameworks

/

base

/

core

/

java

/

android

/

view

/

KeyEvent

.

java

(

按鍵事件定義

)

2

)

frameworks

/

base

/

services

/

java

/

com

/

android

/

server

/

KeyInputQueue

.

java

(

事件讀取線程

)

      //PS:相當于getMessage,待定。

3

)

frameworks

/

base

/

services

/

java

/

com

/

android

/

server

/

WindowManagerService

.

java(事件分發線程)

      //PS:相當于postMessage,sendMessage ,待定。

4

)

frameworks

/

base

/

core

/

java

/

android

/

view

/

KeyCharacterMap

.

java

(

功能鍵轉換kcm

)

5

)

frameworks

/

base

/

libs

/

ui

/

EventHub

.

cpp

(

鍵碼與鍵值轉換

)

轉載于:https://www.cnblogs.com/titer1/archive/2011/08/15/2138625.html