Android input 系统之二:InputDispatcher线程

本文深入探讨Android输入系统,重点解析InputDispatcher线程在touch事件处理中的角色和流程,阐述事件从获取到分发的过程。
摘要由CSDN通过智能技术生成

Android input 系统之二:InputDispatcher线程

touch事件处理流程:
touch事件数据获取处理后分发流程:

"InputDispatcher 线程"

InputDispatcher::InputDispatcher(const sp<InputDispatcherPolicyInterface>& policy) :
    //创建Looper对象
    mLooper = new Looper(false);

bool InputDispatcherThread::threadLoop()
    mDispatcher->dispatchOnce() //整个过程不断循环地调用InputDispatcher的dispatchOnce()来分发事件
    void InputDispatcher::dispatchOnce()  frameworks/native/services/inputflinger/InputDispatcher.cpp
        //唤醒等待线程,monitor()用于监控dispatcher是否发生死锁
        mDispatcherIsAliveCondition.broadcast();
        //当mCommandQueue不为空时处理
>>>>>>>>>>> dispatchOnceInnerLocked(&nextWakeupTime);
            nsecs_t currentTime = now(); //当前时间,也是后面ANR计时的起点

                if (!mDispatchEnabled) {
    //默认值为false
                    resetKeyRepeatLocked(); //重置操作
                }
                if (mDispatchFrozen) {
    //默认值为false
                    return; //当分发被冻结,则不再处理超时和分发事件的工作,直接返回
                }

               //优化app切换延迟,当切换超时,则抢占分发,丢弃其他所有即将要处理的事件。
               bool isAppSwitchDue = mAppSwitchDueTime <= currentTime;
               ...
 
               if (!mPendingEvent) {
   
                   if (mInboundQueue.isEmpty()) {
   
                        if (!mPendingEvent) {
   
                            return; //没有事件需要处理,则直接返回
                        }
                   } else {
   
                        //从mInboundQueue取出头部的事件
                         mPendingEvent = mInboundQueue.dequeueAtHead();
                   }
                  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值