作家
登录

Android Input子系统:Input进程的创建,监听线程的启动

作者: 来源: 2017-09-12 08:47:44 阅读 我要评论


大年夜我小我的懂得来看,Android的Input体系其实就是体系级的事宜处理、分发框架,它须要的功能模块大年夜致有:事宜攫取、事宜分类、事宜分发。那么我们就大年夜全部Input体系的输入源入手,懂得事宜是若何被输入到Input体系中的。

本文重要大年夜体系源码的角度带你一步步懂得Android Input子体系。

在看代码前我们先想一想,如不雅要我们设计一个事宜分发框架的输入攫取模块,要推敲到哪些子模块:

  • 事宜生成模块(当用户对设备进行操作产生InputEvent,硬件产生中断将事宜交给驱动,驱动交给内核,内核交给framework)
  • 事宜监听模块(这里就很像设计一个办事器,为了及时响应来自客户端的请求,则须要启动一个线程监听)
  • 事宜攫取模块
  • 事宜分发模块

那么如今我们最起码可以知道全部进修的起点了,就是Input体系中,负责监听的线程是谁,监听的过程中它们做了什么。 在开端之前,给大年夜家分享一张我根据本文内容画的图:

Android Input子体系:Input过程的创建,监听线程的启动

InputManagerService初始化概览

起首,有几点共鸣我们都可以杀青:

  • Android Framework层的Service(Java)都是由system_server过程创建的(因为没有fork,是以都运行在system_server过程中)
  • Service创建后就会交给运行在system_server过程中的ServiceManager治理。

是以对于InputManagerService的创建,我们可以在SystemServer的startOtherServices()办法中找到,该办法做了以下工作:

  • 创建InputManagerService对象
  • 将它交给ServiceManager治理
  • 将WindowManagerService的InputMonitor注册到InputManagerService中作为窗口响应事宜后的回调
  • 完成以上工作后启动InputManagerService。 
  1. SystemServer.javastartOtherServices(){ 
  2.     …… 
  3.     inputManager = new InputManagerService(context); 
  4.     …… 
  5.     inputManager.setWindowManagerCallbacks(wm.getInputMonitor()); 
  6.     inputManager.start(); 
  7.     …… 

接下来我们就逐部分进修响应的处理。

InputManagerService对象的创建

创建InputManagerService对象时会完成以下工作:

  • 创建一个负粜ウ理DisplayThread线程中的Message的Handler
  • 调用nativeInit初始化native层的InputManagerService,初始化的时刻传入了DisplayThread的消息队列
  • 用mPtr保存native层的InputManagerService
  • 初始化完成后将Service添加到LocalServices,经由过程Map以键值对的情势存储 
  1. InputManagerService.javapublic InputManagerService(Context context) {    this.mContext = context;    this.mHandler = new InputManagerHandler(DisplayThread.get().getLooper()); 
  2.  
  3.     mUseDevInputEventForAudioJack = 
  4.             context.getResources().getBoolean(R.bool.config_useDevInputEventForAudioJack); 
  5.     Slog.i(TAG, "Initializing input manager, mUseDevInputEventForAudioJack=" 
  6.             + mUseDevInputEventForAudioJack); 
  7.     mPtr = nativeInit(this, mContext, mHandler.getLooper().getQueue()); 
  8.  
  9.     LocalServices.addService(InputManagerInternal.class, new LocalService()); 

这里可能有人就会问了,为什么InputManagerService要和DisplayThread绑定在一路?大年夜家不妨想想,InputEvent无论若何被获取、归类、分发,最终照样要被处理,也就意味着最终它的处理结不雅都要在UI上表现,那么InputManagerService天然要选择和UI亲近一些的线程在一路了。

然则问题又来了,应用都是运行在本身的主线程里的,难道InputManagerService要一个个绑定么,照样一个个轮询?这些做法都太过低效,那换个办法,可弗成以和某个治理或异常亲近所有应用UI的线程绑定在一路呢?

谜底是什么,我在这里先不说,大年夜家可以应用本身的常识想想。

初始化native层的InputManagerService

在nativeInit函数中,将Java层的MessageQueue转换为native层的MessageQueue,然后再掏出Looper用于NativeInputManager的初始化。可见这里的重头戏就是NativeInputManager的创建,这个过程做了以下工作:

 1/5    1 2 3 4 5 下一页 尾页

  推荐阅读

  你的还是我的?谈谈云安全责任共担模型

51CTO诚邀您9月23号和秒拍/国美/美团元专家一路聊智能CDN的优化之路,抓紧时光哦! 以前几个月,安然界见证了多起重大年夜云数据泄漏事宜。6月份1.97亿美国选平易近的泄漏事宜,震动全球。>>>详细阅读


本文标题:Android Input子系统:Input进程的创建,监听线程的启动

地址:http://www.17bianji.com/lsqh/37309.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)