InputManager类处理过程:

InputManager 先创建InputDispatcher 和InputReader对象,并把InputReader和InputDispatcher对象为参数再创建两个线程对象,InputReaderThread 以及InputDispatcherThread。InputManager::start()启动两个线程。

InputReader类处理过程:

InputReader::loopOnce()--->EventHub::getEvents()--->InputReader::processEventsLocked()---

--->InputReader::processEventsForDeviceLocked()--->InputDevice::process()--->TouchInputMapper::process()--

--->TouchInputMapper::sync()--->TouchInputMapper::dispatchTouches()

EventHub类处理过程:

getEvents()函数负责处理事件,可以处理不止一个事件,这个之前版本源码不同,scanDirLock()负责扫描设备,openDeviceLock()负责生成设备相关信息,新版函数都在后面加了Lock。


读过一些源码之后,我思考了两个问题

1.有些文章说InputReaderThread 和InputDispatcherThread都会在没有事件时进入睡眠状态。研读源码发现InputDispatcher::dispatchOnce()以及mLooper->pollOnce()确实在没有事件需要处理时进行睡眠,但研读InputRedaer源码时,没有了解其如何睡眠。

2.InputReader是如何和InputDispatcher交互的?因为老版本源码,InputReader有getDispatcher()函数,但新版本替换为getListener()。


继续研读代码发现答案:

1.InputReaderThread::loopOnce会休眠到EventHub::getEvents()中的epoll_wait(),epoll_wait()是系统调用,负责轮询IO的。

2.getListener()是一个队列 ,队列缓存了需要处理的事件,队列对象还持有一个Inputdispatcher对象。

明天继续研读,写写笔记免得自己忘掉。

更多相关文章

  1. android 在listview上的 gallery 禁止上下滑动
  2. FFmpeg学习—android 编译 ffmpeg 集成fdk-aac、x264 精简解码库
  3. ffmpeg(一) android ndk编译ffmpeg
  4. listview中放Button 点击 长按事件
  5. Android事件分发机制解析
  6. Andriod使用Intent实现拨号
  7. 事件分发系列—View中的dispatchTouchEvent和onTouchEvent分析
  8. 扩大View的点击区域
  9. Android事件处理(6)

随机推荐

  1. 环境配置
  2. API 23 widget.AnalogClock——属性分析
  3. edittext底部输入
  4. Android(安卓)如何获取RadioGroup选中Rad
  5. android N0 屏蔽某个应用的通知
  6. 安卓开发问题记录
  7. ListView CheckBox点击事件
  8. android 分段显示文本颜色控件
  9. Android(安卓)Settings 修改默认主题为白
  10. Android控件属性集锦