Android framework Input初始化和上报流程

文章目录

    • 1. 初始化
    • 2. InputChannel服务端的创建和监听FD的注册
    • 3. InputChannel客户端注册和监听上报流程
    • 4. Input FW! Input Native事件上报流程
    • 5. 在Framework注册一个新的监听事件, 需要的步骤

1. 初始化

  1. 初始化Input Dispatcher和InputReader, 用于上报事件;
  2. 初始化Input DIspatcherThread 和InputReaderThread,用于轮询可用事件;
  3. 启动Input DIspatcherThread 和InputReaderThread, 开始轮询事件,并分发;

Android framework Input初始化和上报流程_第1张图片

2. InputChannel服务端的创建和监听FD的注册

  1. 创建一组InputChannel Pair, 用于进程通信;
  2. 注册服务端inputChannel(处于Input进程), 用于发送input事件到上层;
  3. 返回客户端inputChannel, 后面进行注册,用于接收服务端发送的事件;
    [Input channel pair 的创建是使用linux的socketpair函数]

Android framework Input初始化和上报流程_第2张图片

3. InputChannel客户端注册和监听上报流程

  1. 注册客户端inputChannel (InputEventReceiver), 开始接收到来的Input事件;
  2. 使用InputEventReceiver接受服务端发来的Input事件, 并上报到framewor java层;

Android framework Input初始化和上报流程_第3张图片

4. Input FW! Input Native事件上报流程

  1. InputReader使用EventHub从底层获取上报的Event数据, 并enqueue;
  2. Enqueue之前的拦截判断(根据回调PhoneWindowManager中对应函数的返回值)
  3. Enqueue;
    4, InputDispatcher从 队列中获取到InputEvent数据, 并开始分发前准备
  4. 时间分发前的拦截判断(同上);
  5. 开始分发Input事件;

Android framework Input初始化和上报流程_第4张图片

5. 在Framework注册一个新的监听事件, 需要的步骤

//1.创建一对InputChannel对象(一般channels[0]时服务端,用来做底层上报,
//channels[1]时客户端,用来做上层的input事件接受端):
 InputChannel[] channels = InputChannel.openInputChannelPair(name);
//2. 分别记录保存:
mServerChannel = channels[0];
        if (inputChannel != null) {
            channels[1].transferTo(inputChannel); //如果你有需要转换到的目标inputChannel,可以将制定的inputChannel对象作为客户端,调用transferTo即可
            channels[1].dispose(); // transFerTo之后一定要释放该引用;
            mClientChannel = inputChannel;
        } else {
            mClientChannel = channels[1];
        }
//3. 注册服务端到底层:
mService.mInputManager.registerInputChannel(mServerChannel, null);

//4. 创建一个InputEventReceiver对象,重写onInputEvent函数,用于接受Input事件:
final classMyInputEventReceiver extends InputEventReceiver {
        public HideNavInputEventReceiver(InputChannel inputChannel, Looper looper) {
            super(inputChannel, looper);
        }

        @Override
        public void onInputEvent(InputEvent event) {
                //上报的事件最后会返回到这里;
        }
     }

//以上,这样就能接收到底层上报的Input事件了,
//多次这样的操作,底层会遍历所有的注册事件(Connection)
//并上报输入事件到每个注册中;

你可能感兴趣的:(Android,开发,移动,Framework,Input)