android輸入事件上報概況
android怎麼擷取輸入事件?輸入事件怎麼派發到對應的視窗上?
1、android input設計思想
驅動偵聽到使用者在不同裝置上的input事件,將事件輸出到檔案中,android通過監聽這些檔案來得知事件的上報,然後派發給對應的view。以下是手機系統中的事件輸出檔案,每個檔案代表一種或者多種事件類型。
add device 1: /dev/input/event0 name: "lsm303dlhc_acc" add device 2: /dev/input/event1 name: "lsm303dlhc_mag" add device 3: /dev/input/event5 name: "7k_handset" add device 4: /dev/input/event4 name: "7x27a_kp" add device 5: /dev/input/event3 name: "ft5x0x_ts" add device 6: /dev/input/event2 name: "tmd2771x"
lsm303dlhc_acc: msensor
lsm303dlhc_mag:gsensor
7k_handset:耳機插拔事件
7x27a_kp:keypad 主要是一些物理按鍵的事件,音量加減鍵等
ft5x0x_ts:tp,這裡包含虛擬按鍵、螢幕的touch事件等
tmd2771x:psensor 和lsensor
2、功能分析
對應的裝置驅動監聽到事件的改變就會將對應的事件寫入到上述的檔案中,android 監聽到這些檔案有變化就讀取當前的事件,然後派發。
android framework有兩個線程負責讀取和派發,它們是在初始化wms時啟動的,然後一直運行,其中InputReaderThread負責讀取裝置檔案中的事件,InputDispatcherThread線程負責派發擷取到的事件。
派發事件,對於key來說會在wms中進行預先處理,然後才會派發到對應的視窗上,touch事件會直接派發到對應的視窗上,android是怎麼派發到客戶視窗的呢?在android 2.3以後採用管道的方式,以前的版本採用binder通訊。客戶視窗事先會註冊好管道,在客戶進程通過讀取管道中事件,然後進行視窗內部的派發。
3、總結 對於android每塊的處理會在後面的文章中進行分別解析。