设为首页 加入收藏

TOP

Android 2.3 input输入事件处理
2014-11-24 14:30:36 来源: 作者: 【 】 浏览:4
Tags:Android 2.3 input 输入 事件 处理

首先,简而言之的介绍一下android事件传递的流程,按键,触屏等事件是经由WindowManagerService获取,并通过共享内存和管道的方式传递给ViewRoot,ViewRoot再dispatch给Application的View。当有事件从硬件设备输入时,system_server端在检测到事件发生时,通过管道(pipe)通知ViewRoot事件发生,此时ViewRoot再去的内存中读取这个事件信息。下面以一个模块划分图了解一下整个过程:



下面详细介绍一个各个模块主要处理流程:


1、建立通读通道初始化:


A、WindowManagerService与ViewRoot建立管道初始化


WindowManagerService : 主要负责事件传递,运行于system_server中,主要利用inputmanager启动input事件启动线程


读取event数据


WindowManagerService--->ViewRoot方向的管道通信,表示WMS通知ViewRoot有新事件被写入到共享内存;



ViewRoot-->WindowManagerService方向的管道通信,表示ViewRoot已经消化完共享内存中的新事件,特此通知WMS。


ViewRoot和WindowManagerService的管道的文件描述符都是被存储在一个名为InputChannel的类中,这个InputChannel类是


管道通信的载体。而这两者间通过ashmem_create_region创建匿名内存进行数据的传递 。


ViewRoot.java 端建立管道:


mInputChannel = new InputChannel();
try {
res = sWindowSession.add(mWindow, mWindowAttributes,
getHostVisibility(), mAttachInfo.mContentInsets,
mInputChannel);
} catch (RemoteException e)


WindowManagerService.java 建立管道:


if (outInputChannel != null) {
String name = win.makeInputChannelName();
InputChannel[] inputChannels = InputChannel.openInputChannelPair(name);
win.mInputChannel = inputChannels[0];
inputChannels[1].transferToBinderOutParameter(outInputChannel);

mInputManager.registerInputChannel(win.mInputChannel);
}


创建一对InputChannel,这一对InputChannel中实现了一组全双工管道及申请共享内存,其中outInputChannel为ViewRoot传递来的


InputChannel对象,在addWindow中对其进行赋值。如此两者利用pipe建立控制通道,利用共享内存建立数据通道。


这是涉及到的文件如下:


frameworks/base/service/java/com/android/server/WindowManagerService.java


frameworks/base/core/java/android/view/ViewRoot.java


--> jni android_view_InputChannel.cpp


--> InputTransport.cpp



B、InputChannel的注册过程


一个管道通信只是对应一个Activity的事件处理,也就是当前系统中有多少个Activity就会有多少个全双工管道,那么系统需要一个管理者来管理以及调度每一个管道通信,因此我们在创建完InputChannel对象后,需要将其注册到这个InputManager管理中。


采用Looper来轮询是否有事件发生,InputManager启动了2个进程来管理事件发生与传递,InputReaderThread和InputDispatcherThread,InputReaderThread进程负责轮询事件发生; InputDispatcherThread负责dispatch事件。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Android开发教程:使用ListView实.. 下一篇Android键盘输出增加按键码

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: