开发学院手机开发Android 开发 Android事件处理:按键、触摸屏和滚动球的一些实现... 阅读

Android事件处理:按键、触摸屏和滚动球的一些实现细节

 2010-08-22 04:56:00 来源:WEB开发网   
核心提示:Initzygotesystem-serverwindowsmanagerUEventObserverInputDeviceReadInputDispatcherDisplayEventThrActivityManagerEventHub:而事件的传入是从EventHub开始的,EventHub是事件的抽象结构,And

Init

zygote

system-server

windowsmanager

UEventObserver

InputDeviceRead

InputDispatcher

DisplayEventThr

ActivityManager

EventHub:

而事件的传入是从EventHub开始的,EventHub是事件的抽象结构,维护着系统设备的运行情况,设备类型包括Keyboard、 TouchScreen、TraceBall。它在系统启动的时候会通过open_device方法将系统提供的输入设备都增加到这个抽象结构中,并维护一个所有输入设备的文件描述符,如果输入设备是键盘的话还会读取/system/usr/keylayout/目录下对应键盘设备的映射文件,另外 getEvent方法是对EventHub中的设备文件描述符使用poll操作等侍驱动层事件的发生,如果发生的事件是键盘事件,则调用Map函数按照映射文件转换成相应的键值并将扫描码和键码返回给KeyInputQueue。

KeyLayoutMap主要是读取键盘映射文件并将键盘扫描码和键码进行转换

frameworksasecorejniserver com_android_server_KeyInputQueue.cpp

EventHub和KeyinputQueue的JNI接口层

KeyinputQueue:

在线程InputDeviceReader中会根据事件的类型以及事件值进行判断处理,从而确定这个事件对应的设备状态是否发生了改变并相应的改变对这个设备的描述结构InputDevice。

getEvent:在给定时间段时看是否有事件发生,如果有的话返回true否则false。

Windowmanager:

(frameworks/base/services/java/com/android/server/windowmanagerservice.java)

进程Windowmanager会创建一个线程(InputDispatcherThread),在这个线程里从事件队列中读取发生的事件(QueuedEvent ev = mQueue.getEvent()),并根据读取到事件类型的不同分成三类(KEYBOARD、TOUCHSCREEN、TRACKBALL),分别进行处理,例如键盘事件会调用dispatchKey((KeyEvent)ev.event, 0, 0)以将事件通过Binder发送给具有焦点的窗口应用程序,然后调用 mQueue.recycleEvent(ev)继续等侍键盘事件的发生;如果是触摸屏事件则调用dispatchPointer(ev, (MotionEvent)ev.event, 0, 0),这里会根据事件的种类(UP、DOWN、MOVE、OUT_SIDE等)进行判断并处理,比如Cancel或将事件发送到具有权限的指定的窗口中去;

Android 输入事件流程

EventHub

1 2 3 4 5 6  下一页

Tags:Android 事件 处理

编辑录入:coldstar [复制链接] [打 印]
[]
  • 好
  • 好的评价 如果觉得好,就请您
      0%(0)
  • 差
  • 差的评价 如果觉得差,就请您
      0%(0)
更多精彩
    赞助商链接

    热点阅读
      焦点图片
        最新推荐
          精彩阅读