输入系统_Reader线程_使用EventHub读取事件

reader线程获得事件处理传给Dispatcher线程。

分三步:

A1、使用EventHub读取事件

        reader线程获得事件(APP层)

size_t count = mEventHub->getEvents(timeoutMillis, mEventBuffer, EVENT_BUFFER_SIZE);

mEventBuffer是一个数组,类型是:
struct RawEvent {
    nsecs_t when;
    int32_t deviceId;
    int32_t type; //各种类型如下
    int32_t code;
    int32_t value;
};
enum {
    // Sent when a device is added.
    DEVICE_ADDED = 0x10000000,
    // Sent when a device is removed.
    DEVICE_REMOVED = 0x20000000,
    // Sent when all added/removed devices from the most recent scan have been reported.
    // This event is always sent at least once.
    FINISHED_DEVICE_SCAN = 0x30000000,

    FIRST_SYNTHETIC_EVENT = DEVICE_ADDED,
};

使用inotify检测/dev/input目录(有无设备插入在eventhub构造函数里添加的),使用epoll检测input目录和目录下的各个event0,1文件有无数据(在扫描目录的时候添加的)。

然后get_eventhub函数会创建rawevent结构体type就是插入拔出等等具体的输入事件。

内核层(原始数据):

struct input_event {
    struct timeval time;
    __u16 type; //KEY,REL,ABS
    __u16 code;
    __s32 value;
};

A2、处理事件

        在get_event中肯定会调用epoll_wait()来检测目录。返回之后,就会分辨到底是什么。构造rawevent结构体

A3、给Dispatcher线程发送事件

输入系统_Reader线程_使用EventHub读取事件_第1张图片

你可能感兴趣的:(输入系统,Android,输入系统)