Android 输入系统(三)InputReader

在之前,整理了输入系统服务InputManagerService(服务的生成、启动),EventHub(读取原始输入事件、设备增删)。接着来了解一下InputReader,InputReader主要工作是从EventHub读取事件、进行加工、将加工好的事件发送到InputDispatcher。

                                                                                                                                                                                         

1 InputReader初始化

由InputManagerService这篇博客中,可知InputManagerService初始化的时候,一层层调用,最终在InputManager中初始化InputReader和InputReaderThread。

先看下InputReader的构造函数

InputReader::InputReader(const sp<EventHubInterface>& eventHub,
        const sp<InputReaderPolicyInterface>& policy,
        const sp<InputListenerInterface>& listener) :
        mContext(this), mEventHub(eventHub), mPolicy(policy),
        mGlobalMetaState(0), mGeneration(1),
        mDisableVirtualKeysTimeout(LLONG_MIN), mNextTimeout(LLONG_MAX),
        mConfigurationChangesToRefresh(0) {
    mQueuedListener = new QueuedInputListener(listener);

    { // acquire lock
        AutoMutex _l(mLock);

        refreshConfigurationLocked(0);
        updateGlobalMetaStateLocked();
    } // release lock
}
初始化必要的变量,mEventHub对应EventHub对象,mPolicy对应NativeInputManager对象,mGlobalMetaState表示控制键的状态,mGeneration表示输入设备的状态,mQueuedListener用来将加工后的按键事件传到InputDispatcher。

                                                                                                                                                                                         

InputReaderThread循环体

InputManagerService的start() 层层调用 最后调用到 InputManager的start()中。

result = mReaderThread->run("InputReader", PRIORITY_URGENT_DISPLAY);
InputReaderThread开始运行,以下是InputReaderThread的线程循环,返回true则循环不断的调用threadLoop()方法,返回false则退出循环。
bool InputReaderThread::threadLoop() {
    mReader->loopOnce();
    return true;
}

该线程中会循环不断的执行mReader->loopOnce();看一下loopOnce中具体干了些什么。

void InputReader::loopOnce() {
    int32_t oldGeneration;
    int32_t timeoutMillis;
    bool inputDevicesChanged = false;
    Vector<InputDeviceInfo> inputDevices;
    { // acquire lock
        AutoMutex _l(mLock);

        oldGeneration = mGeneration;
        timeoutMillis = -1;
	//查看InputReader配置是否修改,如界面大小、方向、键盘布局重新加载、指针速度改变等
        uint32_t changes = mConfigurationChangesToRefresh;
        if (changes) {
            mConfigurationChangesToRefresh = 0;
            timeoutMillis = 0;
            refreshConfigurationLocked(changes); //刷新配置
         } else if (mNextTimeout != LLONG_MAX) {
            nsecs_t now = systemTime(SYSTEM_TIME_MONOTONIC);
            timeoutMillis = toMillisecondTimeoutDelay(now, mNextTimeout);
        }
    } // release lock
    //获取输入事件、设备增删事件,count为事件数量。
    size_t count = mEventHub->getEvents(timeoutMillis, mEventBuffer, EVENT_BUFFER_SIZE);

    { // acquire lock
        AutoMutex _l(mLock);
        mReaderIsAliveCondition.broadcast();

        if (count) {//处理事件
            processEventsLocked(mEventBuffer, count);
        }

        if (mNextTimeout !
  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值