Android framework Input初始化和上报流程

1. 初始化

1. input初始化

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

1. Input FW启动流程

2. Input layout mapper的初始化加载和event分发前的map流程

  1. 创建InputDevice;
  2. 加载kaylayout并初始化mapper;
  3. 分发前由maper先mapKey之后再dispatch;

在这里插入图片描述

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

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

InputChannel的创建和监听FD的注册

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

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

InputChannel注册和监听上报流程

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

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

在这里插入图片描述

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)
//并上报输入事件到每个注册中;
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值