【android Framework 探究】事件分发

本文探讨了Android Framework中的事件分发流程,从硬件到内核再到框架层,重点分析了ViewRootImpl在事件处理中的关键作用,以及InputEventReceiver如何将事件分发到View。通过类图和序列图,清晰展示了事件从native层到应用层的传递路径,为理解Android事件分发机制提供了基础认知。
摘要由CSDN通过智能技术生成

概述

android的input系统大概可以分为三个部分,按照事件的产生和消费顺序是:硬件->内核–>framework–>应用

1,设备硬件,包括屏幕,鼠标,键盘等等。
2,内核驱动,linux内核将事件写入/dev/input的节点。
3,Framework,也可以划分为native层和java层,native层拿到事件后封装并交给java层。
4,应用app,消费事件,针对不同事件来做出不同反馈。
其中3,4是作为Android Framework开发人员重点研究的方向,4更是所有Android从业人员需要掌握的基础技能。

在这里插入图片描述

本章源码基于AOSP android 7.1.2 ,点击查看

开头

耐不住对源码的好奇,我先通过这篇文章概况下Framework的java层收到native传递过来的事件后,是怎样一步步分发到view的,开始之前请先关注这个类。

在这里插入图片描述这很重要,它就是Framework处理事件中的一个转折点,承接native和java这两层的中间态。

阅读源码还是坚持那个原则,不沉溺细节,抽取重点。先形成一个骨架,后面再慢慢丰富细节。

1,ViewRootImpl:“我很重要,都在我这里”

InputEventReceiver是一个抽象类,ViewRootImpl中的WindowInputEventReceiver实现了它,那么这里就是处理事件的入口之一,ViewRootImpl是一个很重要的角色,像窗口管理,视图管理,事件分发等任务都和它有关联,本篇文章的讨论基本都在它的范围内。

 //frameworks/base/core/java/android/view/ViewRootImpl.java
6343      final class WindowInputEventReceiver extends InputEventReceiver {
   
....
6348          @Override
6349          public void onInputEvent(InputEvent event) {
   
6350              enqueueInputEvent(event, this, 0, true);
6351          }
 
 }

很明显,看到event紧接着到了enqueueInputEvent这个方法。

6159      void enqueueInputEvent(InputEvent event,
6160              InputEventReceiver receiver, int flags, boolean processImmediately) {
   
....
				//processImmediately为false,事件加入到消息队列中,然后按顺序处理。
				//processImmediately为true,立即处理,然后按顺序处理,最终都会调用到doProcessInputEvents。
6181          if (processImmediately) {
   
6182              doProcessInputEvents();
6183          } else {
   
6184              scheduleProcessInputEvents();
6185          }
6186      }
6197      void doProcessInputEvents() {
   
6198          // Deliver all pending input events in the queue.
6199          wh
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值