大年夜我小我的懂得来看,Android的Input体系其实就是体系级的事宜处理、分发框架,它须要的功能模块大年夜致有:事宜攫取、事宜分类、事宜分发。那么我们就大年夜全部Input体系的输入源入手,懂得事宜是若何被输入到Input体系中的。
本文重要大年夜体系源码的角度带你一步步懂得Android Input子体系。
在看代码前我们先想一想,如不雅要我们设计一个事宜分发框架的输入攫取模块,要推敲到哪些子模块:
- 事宜生成模块(当用户对设备进行操作产生InputEvent,硬件产生中断将事宜交给驱动,驱动交给内核,内核交给framework)
- 事宜监听模块(这里就很像设计一个办事器,为了及时响应来自客户端的请求,则须要启动一个线程监听)
- 事宜攫取模块
- 事宜分发模块
那么如今我们最起码可以知道全部进修的起点了,就是Input体系中,负责监听的线程是谁,监听的过程中它们做了什么。 在开端之前,给大年夜家分享一张我根据本文内容画的图:
InputManagerService初始化概览
起首,有几点共鸣我们都可以杀青:
- Android Framework层的Service(Java)都是由system_server过程创建的(因为没有fork,是以都运行在system_server过程中)
- Service创建后就会交给运行在system_server过程中的ServiceManager治理。
是以对于InputManagerService的创建,我们可以在SystemServer的startOtherServices()办法中找到,该办法做了以下工作:
- 创建InputManagerService对象
- 将它交给ServiceManager治理
- 将WindowManagerService的InputMonitor注册到InputManagerService中作为窗口响应事宜后的回调
- 完成以上工作后启动InputManagerService。
- SystemServer.javastartOtherServices(){
- ……
- inputManager = new InputManagerService(context);
- ……
- inputManager.setWindowManagerCallbacks(wm.getInputMonitor());
- inputManager.start();
- ……
- }
接下来我们就逐部分进修响应的处理。
InputManagerService对象的创建
创建InputManagerService对象时会完成以下工作:
- 创建一个负粜ウ理DisplayThread线程中的Message的Handler
- 调用nativeInit初始化native层的InputManagerService,初始化的时刻传入了DisplayThread的消息队列
- 用mPtr保存native层的InputManagerService
- 初始化完成后将Service添加到LocalServices,经由过程Map以键值对的情势存储
- InputManagerService.javapublic InputManagerService(Context context) { this.mContext = context; this.mHandler = new InputManagerHandler(DisplayThread.get().getLooper());
- mUseDevInputEventForAudioJack =
- context.getResources().getBoolean(R.bool.config_useDevInputEventForAudioJack);
- Slog.i(TAG, "Initializing input manager, mUseDevInputEventForAudioJack="
- + mUseDevInputEventForAudioJack);
- mPtr = nativeInit(this, mContext, mHandler.getLooper().getQueue());
- LocalServices.addService(InputManagerInternal.class, new LocalService());
- }
这里可能有人就会问了,为什么InputManagerService要和DisplayThread绑定在一路?大年夜家不妨想想,InputEvent无论若何被获取、归类、分发,最终照样要被处理,也就意味着最终它的处理结不雅都要在UI上表现,那么InputManagerService天然要选择和UI亲近一些的线程在一路了。
然则问题又来了,应用都是运行在本身的主线程里的,难道InputManagerService要一个个绑定么,照样一个个轮询?这些做法都太过低效,那换个办法,可弗成以和某个治理或异常亲近所有应用UI的线程绑定在一路呢?
谜底是什么,我在这里先不说,大年夜家可以应用本身的常识想想。
初始化native层的InputManagerService
在nativeInit函数中,将Java层的MessageQueue转换为native层的MessageQueue,然后再掏出Looper用于NativeInputManager的初始化。可见这里的重头戏就是NativeInputManager的创建,这个过程做了以下工作:
推荐阅读
51CTO诚邀您9月23号和秒拍/国美/美团元专家一路聊智能CDN的优化之路,抓紧时光哦! 以前几个月,安然界见证了多起重大年夜云数据泄漏事宜。6月份1.97亿美国选平易近的泄漏事宜,震动全球。>>>详细阅读
本文标题:Android Input子系统:Input进程的创建,监听线程的启动
地址:http://www.17bianji.com/lsqh/37309.html
1/2 1