Android输入系统笔记

InputDispatcher的线程循环由InputDispatchr::diapatchOnce()完成


InputDispatcher::diapatchOnce(){
1、通过dispatcherInnerOnceLocked()进行输入事件的派发,其传出参数nextWeakupTime决定下次派发线程的循还执行时间
2、执行命令队列中的命令,可以通过InputDispatcher::postCommandLocked()函数将命令追加到命令列表中
3,如果有必要,将派发线程进入休眠状态,并由nextWeakupTime确定具体的休眠时间,Looper的pollOnce的实质就是epoll_wait()
  派发线程在三种情况下将被唤醒:
1、有事件注入派发列队时,调用Looper::wake()主动唤醒
2、epol_wait()坚挺的fd有epoll_event发生时
3、到达nextWeakupTime的时间点时
}




//该函数体现了派发过程的整体流程
InputDispatcher::dispatcherInnerOnceLocked(nextWeakUpTime){
1、setInputDispatchMode()函数可以使InputDispatcher在禁用,冻结,和正常三种状态下切换
2、从派发队列中取出一事件进行派发
如果派发队列为空,则直接返回。nextWeakupTime保持LONG_LONG_MAX,派发队列进入无限的休眠期
   resetANRTimeoutsLocked(),为事件重置ANR信息
3、检查时间是否需要被丢弃,dropReason描述了时间是否需要被丢弃
4、执行dispatchMotionLocked()进行Motion事件的派发
}


DropReason枚举完整的描述了是事件被丢弃的所有原因:
1、DROP_REASON_POLICY:
2、DROP_REASON_APP_SWITCH
3、DROP_REASON_BLOCKED
4、DROP_REASON_DISABLED
5、DROP_REASON_STALE


//专门为Motion事件寻找合适的目标窗口
dispatchMotionLocked(){
1、根据Motion事件,寻找合适的窗口,injectionResult保存寻找结果,找到的合适的窗口将会被保存在inputTarget列表中
findTouchedWindowTargetsLocked(correntTime,entry,inputTargets,nextWakeupTime,&conflictPointerActions)
2、调用dispatchEventLocked()将事件派发给inputTargets中
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值