链接:https://juejin.im/post/6844904193950498830
事件的分类
安卓系统中的事件,主要有以下几种:
- 按键事件(KeyEvent) 由物理按键产生的事件,如:Home, Back, Volume Up, Volume Down, Camera 等。今天主要分析的就是这类事件。
- 触摸事件(TouchEvent) 在屏幕上点击拖动,以及由它们组合的各种事件。
- 鼠标事件(MouseEvent) 鼠标操作产生的事件
- 轨迹球事件 (TrackBallEvent) 知道轨迹球的,怕不是要暴露年龄
安卓针对上面这些事件共性,提取了一个统一的抽象类 InputEvent 。InputEvent 提供了几个常用的抽象方法,比如 getDevice() 获得当前事件的“硬件源”,getEventTime() 获取事件发生的时间。
InputEvent 有两个子类:
- KeyEvent 用于描述按键事件
- MotionEvent 用来描述 Movement 类型的事件(通过 mouse, pen, finger, trackball 产生)。
而我们要监听这些事件一般也是通过对 View 设置相应的监听实现
setOnKeyListener(OnKeyListener)
setOnTouchListener(OnTouchListener)
…
或者也可以直接复写相关的方法
boolean onKeyDown(int keyCode, KeyEvent event)
boolean onTouchEvent(MotionEvent event)
…
事件处理的准备工作
事件处理设计的整体思路是驱动层会有一个消息队列来存放事件,会有一个 Reader 来不停的读取事件,一个 Dispatcher 来分发消息队列中的事件。Dispatcher 分发的事件最后会通过 jni 上报到 InputManagerService,然后通过接口最后传递给PhoneWindow,PhoneWindow 再根据不同的事件类型来做不同的处理。
我们先看一下 Reader、Dispatcher 是怎么来的。
SystemServer