概述
android的input系统大概可以分为三个部分,按照事件的产生和消费顺序是:硬件->内核–>framework–>应用
1,设备硬件,包括屏幕,鼠标,键盘等等。
2,内核驱动,linux内核将事件写入/dev/input的节点。
3,Framework,也可以划分为native层和java层,native层拿到事件后封装并交给java层。
4,应用app,消费事件,针对不同事件来做出不同反馈。
其中3,4是作为Android Framework开发人员重点研究的方向,4更是所有Android从业人员需要掌握的基础技能。
本章源码基于AOSP android 7.1.2 ,点击查看
开头
耐不住对源码的好奇,我先通过这篇文章概况下Framework的java层收到native传递过来的事件后,是怎样一步步分发到view的,开始之前请先关注这个类。
这很重要,它就是Framework处理事件中的一个转折点,承接native和java这两层的中间态。
阅读源码还是坚持那个原则,不沉溺细节,抽取重点。先形成一个骨架,后面再慢慢丰富细节。
1,ViewRootImpl:“我很重要,都在我这里”
InputEventReceiver是一个抽象类,ViewRootImpl中的WindowInputEventReceiver实现了它,那么这里就是处理事件的入口之一,ViewRootImpl是一个很重要的角色,像窗口管理,视图管理,事件分发等任务都和它有关联,本篇文章的讨论基本都在它的范围内。
//frameworks/base/core/java/android/view/ViewRootImpl.java
6343 final class WindowInputEventReceiver extends InputEventReceiver {
....
6348 @Override
6349 public void onInputEvent(InputEvent event) {
6350 enqueueInputEvent(event, this, 0, true);
6351 }
}
很明显,看到event紧接着到了enqueueInputEvent这个方法。
6159 void enqueueInputEvent(InputEvent event,
6160 InputEventReceiver receiver, int flags, boolean processImmediately) {
....
//processImmediately为false,事件加入到消息队列中,然后按顺序处理。
//processImmediately为true,立即处理,然后按顺序处理,最终都会调用到doProcessInputEvents。
6181 if (processImmediately) {
6182 doProcessInputEvents();
6183 } else {
6184 scheduleProcessInputEvents();
6185 }
6186 }
6197 void doProcessInputEvents() {
6198 // Deliver all pending input events in the queue.
6199 wh