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每块的处理会在后面的文章中进行分别解析。