Android系统MotionEvent处理Receiver端基本原理总结
InputEventReceiver
Android系统中activity是接收用户触屏事件的基本单位, 一个activity对应一个window, 对应一个view root. activity初始化的时候, 每一个activity实例都会创建一个用于接收事件的socket通讯通道, system server进程通过对windows的管理, 找到当前需要接收事件的activity, 通过socket直接将事件数据发送给 activity, activity内以root view为起点, 对事件进行分发处理.
每一个viewrootimpl都有一个InputEventReceiver对象, WindowInputEventReceiver在viewrootimpl:: setView时, new InputEventReceiver构造时调用nativeInit,创建NativeInputEventReceiver,将自己的指针传给NativeInputEventReceiver,同时保留NativeInputEventReceiver的指针。
所以,每一个ViewRootImpl对应一个NativeInputEventReceiver。NativeInputEventReceiver的handleEvent会调用到相应的ViewRootImpl。
NativeInputEventReceiver是一个LooperCallback
LooperCallback定义在system/core/include/utils/Looper.h中,作为Looper::addFd的回调
NativeInputEventReceiver的构造函数会接收Java层传递的main looper的MessageQueue指针, 初始化过程中, 调用main looper的addFd将改ViewRootImpl的InputChannel的接收端的fd添加到main loope的轮循中,同时将NativeInputEventReceiver注册为回调.
每次receiver端的socket中的事件到达触发NativeInputEventReceiver的函数handleEvent调用.
WindowInputEventReceiver extends InputEventReceiver
WindowInputEventReceiver:: onInputEvent , onBatchedInputEventPending 在NativeInputEventReceiver::handleEvent中被调用