Android输入系统之EventHub(AndroidV)

一:概述

    由Android输入系统之启动篇(AndroidV)-优快云博客可知,EventHub是InputReader读取设备input事件的中间件,它采用INotify + epoll机制实现监听目录/dev/input下的所有设备节点,并将事件中指定的时间 + 单调时钟时间 + deviceId + input_event结构体转换成RawEvent结构体返回给InputReader。下面来看下EventHub是如何获取input事件及如何保存设备信息的。

二:获取input事件

    EventHub通过epoll获取到有事件发生时,会保存在mPendingEventItems中。InputReader读取事件时,识别到有事件发生,会从设备中读取事件放入readBuffer中(readBuffer以input_event结构体保存事件),遍历所有事件,每次从readBuffer中获取单个事件,把input_event加上时间、deviceId等封装成RawEvent,遍历完毕后返回。

//frameworks/native/services/inputflinger/reader/EventHub.cpp
std::vector<RawEvent> EventHub::getEvents(int timeoutMillis) {
    std::scoped_lock _l(mLock);
    ...
    for (;;) {
        ...
        if (mNeedToScanDevices) {
            //搜索设备
            scanDevicesLocked();
            ...
        }

        while (!mOpeningDevices.empty()) {
            ...
            events.push_back({
                    .when = now,
                    .deviceId = deviceId,
                    .type = DEVICE_ADDED,//添加设备
            });

            ...
        }

        if (mNeedToSendFinishedDeviceScan) {
            ...
            events.push_back({
                    .when = now,
                    .type = FINISHED_DEVICE_SCAN,//设备检索结束
            });
            ...
        }

        // Grab the next input event.
        bool deviceChanged = false;
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值