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通信。客戶窗口事先會註冊好管道,在客戶進程通過讀取管道中事件,然後進行窗口內部的派發。