1. 初始化
1. input初始化
- 初始化Input Dispatcher和InputReader, 用于上报事件;
- 初始化Input DIspatcherThread 和InputReaderThread,用于轮询可用事件;
- 启动Input DIspatcherThread 和InputReaderThread, 开始轮询事件,并分发;
![1. Input FW启动流程](https://i-blog.csdnimg.cn/blog_migrate/69bd06daaa0eb08d453265930428b0b5.jpeg)
2. Input layout mapper的初始化加载和event分发前的map流程
- 创建InputDevice;
- 加载kaylayout并初始化mapper;
- 分发前由maper先mapKey之后再dispatch;
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/088be6f77a3e21ea6ca81c268947bb99.jpeg)
2. InputChannel服务端的创建和监听FD的注册
- 创建一组InputChannel Pair, 用于进程通信;
- 注册服务端inputChannel(处于Input进程), 用于发送input事件到上层;
- 返回客户端inputChannel, 后面进行注册,用于接收服务端发送的事件;
[Input channel pair 的创建是使用linux的socketpair函数]
![InputChannel的创建和监听FD的注册](https://i-blog.csdnimg.cn/blog_migrate/755bae8ffdc6789ba1aaafbb9b46b151.jpeg)
3. InputChannel客户端注册和监听上报流程
- 注册客户端inputChannel (InputEventReceiver), 开始接收到来的Input事件;
- 使用InputEventReceiver接受服务端发来的Input事件, 并上报到framewor java层;
![InputChannel注册和监听上报流程](https://i-blog.csdnimg.cn/blog_migrate/f083288635cc77a6116dfc185dd9c188.jpeg)
4. Input FW! Input Native事件上报流程
- InputReader使用EventHub从底层获取上报的Event数据, 并enqueue;
- Enqueue之前的拦截判断(根据回调PhoneWindowManager中对应函数的返回值)
- Enqueue;
4, InputDispatcher从 队列中获取到InputEvent数据, 并开始分发前准备 - 时间分发前的拦截判断(同上);
- 开始分发Input事件;
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/86f64f75a5ee726c999e9bd7d43b59a6.jpeg)
5. 在Framework注册一个新的监听事件, 需要的步骤
InputChannel[] channels = InputChannel.openInputChannelPair(name);
mServerChannel = channels[0];
if (inputChannel != null) {
channels[1].transferTo(inputChannel);
channels[1].dispose();
mClientChannel = inputChannel;
} else {
mClientChannel = channels[1];
}
mService.mInputManager.registerInputChannel(mServerChannel, null);
final classMyInputEventReceiver extends InputEventReceiver {
public HideNavInputEventReceiver(InputChannel inputChannel, Looper looper) {
super(inputChannel, looper);
}
@Override
public void onInputEvent(InputEvent event) {
}
}