Android触摸事件全过程分析:由产生到Activity.dispatchTouchEvent()

一. 参考

  1. Android触摸事件全过程分析:由产生到Activity.dispatchTouchEvent()

    https://juejin.cn/post/6844903779435970573

  2. Input系统—启动篇
    http://gityuan.com/2016/12/10/input-manager/

  3. 【带着问题学】android事件分发8连问
    https://juejin.cn/post/6965484155660402702

二. 理解

  1. 触摸屏幕后,事件如何传递给Android系统?

    触摸屏幕后,屏幕硬件产生中断, CPU响应中断,调用屏幕驱动程序进行处理.
    驱动程序处理后将事件写入输入设备节点文件dev/input/event[x] 中.

    总结:硬件驱动程序完成了触摸事件的数据收集

  2. Android系统进程(System Server)对触摸事件的处理?

    (1)系统启动时System Server 进程中会启动一系列的系统服务,其中 InputManagerService 负责对输入事件的管理.
    (2)InputManagerService 内部有一个InputReader线程负责从dev/input/event[x]中读取事件, 后加入到InputDispatch线程的队列里,由其通过InputChannel进行分发.

  3. 系统进程(System Server) 如何将事件传递给App应用进程?
    (1) InputChannel是一个用于跨进程通信的soket.
    (2) WindowManagerService 针对一个Window, 创建了InputChannel的SocketPair, 其中将服务端注册到InputDispatch中;将客户端关联到应用进程中.

  4. App应用进程对触摸事件的处理?
    (1) 应用进程监控发送到InputChannel的客户端的事件
    (//将socket客户端的fd添加到主线程的消息池,
    //通过epoll监听fd)
    , 调用InputEventReceiver.dispachInputEvent进行处理
    (2) 事件回传到ViewRootImpl中, 然后进行一系列的InputStage处理事件,
    经层层回调会走到mView.dispatchPointerEvent; 这里的mView 即DecorView
    (3) DecorView 将事件回调到Activity; 然后Activity又回调到PhoneWindow;
    最后PhoneWindow又回调事件给DecorView.
    (4) 最后事件沿着View树,进行dispatchEvent 一层层的派发和消费.

总体流程图:

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值