android key&&touch event流程分析

android key&&touch event流程分析

ID:6163868

大小:966.00 KB

页数:22页

时间:2017-11-14

android key&&touch  event流程分析_第1页
android key&&touch  event流程分析_第2页
android key&&touch  event流程分析_第3页
android key&&touch  event流程分析_第4页
android key&&touch  event流程分析_第5页
资源描述:

《android key&&touch event流程分析》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、Unicair.cnAndroidKey&&TouchEvent流程分析UnicairCommunicationTecCo.,Ltd.烟台市友开通信技术有限公司在Android系统中,类似于键盘按键等事件是由WindowManagerService服务来管理的,然后再以消息的形式来分发给应用程序进行处理。系统启动时,同时窗口管理服务也会启动,该服务启动过程中,会通过系统输入管理器InputManager来负责监控键盘消息。当某一个Activity激活时,会在该Service下注册一个接收消息的通道,表明可以处理具

2、体的消息,然后当有消息时,InputManager就会分发给当前处于激活状态下的Activity进行处理。先看一张图:InputManager的启动过程InputManager负责事件的监控以及分发,而其启动需要WindowManagerService的启动来完成。而系统启动WindowManagerService的时候,会执行WindowManagerService.java文件的main方法。main方法下会创建一个线程类的实例,并执行其start方法,即调用该线程类下的run方法。run方法里面首先创建一个

3、Looper消息循环,而looper是Android系统里面处理消息的一种机制,然后调用WindowManagerService的构造方法来启动WindowManagerService。最后调用Looper的loop方法,将该线程添加到一个消息循环里面去,这样系统就可以持续的等待接收并处理到来的消息。InputManager的启动过程在WindowManagerService的构造方法里,调用InputManager的构造方法创建一个InputManager对象的实例,并将WindowManagerService

4、对象作为参数传入构造方法里面。在InputManager的构造方法里面得到前面创建的looper对象并将其内部的消息队列作为参数传给JNI层的nativeInit函数里面。nativeInit函数的实现位于JNI层的com_android_server_InputManager.cpp里面。该函数下主要做两件事情。1.通过java层传入的looper消息队列得到和JNI层的looper对象,是其对应起来2.同样为使和java层的InputManager对象对应起来,创建了本地的InputManager对象实例即N

5、ativeInputManager。InputManager的启动过程在创建NativeInputManager的过程中,会创建属于JNI层真正地InputManager对象,并将创建的EventHub对象实例当做参数传入到其构造函数里面。(注意这儿传入的EventHub实例)在InputManager构造函数里面,会分别创建InputDispatcher、InputReader对象的实例并将在创建InputDispatcherThread和InputReaderThread作为参数传入。此时需要注意传入Inpu

6、tReader构造函数里面的eventHub和mDispatcher。并且在创建InputDispatcher的时候,创建了一个属于自己的Looper实例。Initialize函数此时,InputDispatcher和InputReader会通过InputDispatcherThread和InputReaderThread两个线程类来具体的完成事件的分发和读取。到此,InputManager启动完成。应用程序注册键盘消息接收通道Activity启动时,系统会为其创建一个ViewRoot实例,并通过其函数setVi

7、ew方法来将有关的view设置到ViewRoot中去,而Activity正是通过setView来注册消息接收通道的。setView方法中会创建一个输入通道InputChannel的对象实例,并作为参数传入到接下来调用的Session类中的add方法中。而该方法正是调用WindowManagerService类中的addWindow方法,且将InputChannel实例作为参数传入到该方法中。此处调用openInputChannelPair方法来创建一个InputChannel类型的数组,而该方法的具体实现是在In

8、putTransport.cpp内完成的应用程序注册键盘消息接收通道在该方法中,先创建一个服务端的匿名共享内存,可读可写。并将复制一份用于客户端的匿名共享内存,然后通过调用InputChanel的构造函数对服务端和客户端的通道进行实例化。其中服务端为反向管道读端与正向管道写端,客户端正相反。这样就可以使客户端和服务端两通道交叉连接,进行消息的传递。Server端读端(反向

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。