频道栏目
首页 > 程序开发 > 移动开发 > Android > 正文
Android应用程序的消息处理机制学习心得(一)
2013-12-10 11:08:40         来源:Ron的专栏  
收藏   我要投稿

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对象。

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

点击复制链接 与好友分享!回本站首页
上一篇:Android Intent和IntentFilter详解
下一篇:Android 图片处理工具类封装
相关文章
图文推荐
点击排行

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站