news 2026/9/3 4:53:26

Android系列之 屏幕触控机制(一)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Android系列之 屏幕触控机制(一)

目录

1 Android native层传递点击事件

2 .Window和WindowManagerService的关系

2.1 ViewRootImpl 如何串联Window和WindowManagerService

2.2 ViewRootImpl和Window的关系

2.3 ViewRootImpl和WindowManagerService的关系


以下章节待分解:

3. ViewRootImpl的事件接收及分发

4. ViewGroup事件的分发机制

4.1 activity的视图创建流程

4.2 ViewGroup的事件分发流程

4.3 View的事件处理

5. 事件分发具体案例及解决方案

Android屏幕触控机制整体流程图

图1

1 Android native层传递点击事件

当用户点击屏幕时,屏幕会产生触摸事件,Linux内核会将触摸事件封装成event存到/dev/input/文件内。

inputReader从EventHub读取到事件并发送给InputDispatcher,

InputDispatcher分发至framework层 需要处理的地方。

下面我们来详细看一下framework层是如何接收点击事件并最终如何响应点击事件的

图2

2 .Window和WindowManagerService的关系

图3

2.1 ViewRootImpl 如何串联Window和WindowManagerService

当一个点击事件从native传递到framework时,viewRootImpl中的WindowInputEventReceiver()方法会最先响应点击事件。

而这个WindowInputEventReceiver()方法中的mInputChannel参数,是在WindowManagerService(以下简称wms )中和native层关联上的。

这个时候就有个疑问了,点击事件怎么和wms有关联了呢?其实wms他是一个重要的系统服务,用于窗口管理,他就是窗口的大主管,因为它记录了当前系统中所有窗口的完整信息,他还是点击事件的派发者,所以只有它才能判断出要把点击的事件投递给具体的某个应用进程进行处理。而应用进程如何接收的了?这里的应用进程可以理解成是一个应用层级的窗口Window。因为事件点击的目的地是应用层级的窗口Window。而wms和window中间需要一个纽带去衔接,这个中间的纽带就是ViewRootImpl, ViewRootImpl负责view 的绘制,也负责用户的点击操作处理。

下面就讲一下viewRootImp是如何创建并成为window和wms的纽带的。

2.2 ViewRootImpl和Window的关系

说起ViewRootImpl和window的关系,就要先看一下 ViewRootImpl是在哪里被创建的 ,这就要从handleResumeActivity流程开始看起

public void handleResumeActivity(IBinder token, boolean finalStateRequest, boolean isForward,String reason) { …… if (r.window == null && !a.mFinished && willBeVisible) { …… View decor = r.window.getDecorView(); …… ViewManager wm = a.getWindowManager(); …… wm.addView(decor, l); …… }

wm.addView的wm的实例对象就是WindowManagerImpl,其中的参数decor是DecorView对象

接着看WindowManagerImpl的addView方法做了什么

@Override public void addView(@NonNull View view, @NonNull ViewGroup.LayoutParams params) { applyDefaultToken(params); mGlobal.addView(view, params, mContext.getDisplay(), mParentWindow); }

又调用到了 WindowManagerGlobal的addView方法,可以看到ViewRootImpl在这里被创建了,并绑定了DecorView

public void addView(View view, ViewGroup.LayoutParams params, Display display, Window parentWindow) { …… root = new ViewRootImpl(view.getContext(), display); …… mViews.add(view); mRoots.add(root); mParams.add(wparams); root.setView(view, wparams, panelParentView); …… }

2.2 ViewRootImpl和Window的关系

流程图大致介绍了ViewRootImpl是如何创建出来的,总结一下:在ActivityThread的handleResumeActivity()流程中,通过

WindowManager(WindowManagerImpl)的 addView() 实现了ViewRootImpl的创建。 此时我们应用层窗口Window就和ViewRootImpl建立了关联。

图4

2.3 ViewRootImpl和WindowManagerService的关系

而ViewRootImpl和wms的关联,是在ViewRootImpl的setview方法中

mWindowSession.addToDisplay()函数是添加窗口流程,对应的服务端就是WMS,而WMS又是个系统进程,所以这是个Binder跨进程调用方法,最终调用的是WMS的addWindow方法。而参数mInputChannel,它包括了发送和接收消息的功能封装。

最后声明了inputEvent方法,用来接受从底层传过来的点击事件

public void setView(View view, WindowManager.LayoutParams attrs, View panelParentView) { synchronized (this) { ...... requestLayout(); if ((mWindowAttributes.inputFeatures & WindowManager.LayoutParams.INPUT_FEATURE_NO_INPUT_CHANNEL) == 0) { mInputChannel = new InputChannel(); } ...... res = mWindowSession.addToDisplay(mWindow, mSeq, mWindowAttributes, getHostVisibility(), mDisplay.getDisplayId(), mWinFrame, mAttachInfo.mContentInsets, mAttachInfo.mStableInsets, mAttachInfo.mOutsets, mAttachInfo.mDisplayCutout, mInputChannel); ...... if (mInputChannel != null) { … // 声明了inputEvent方法,用来接受从底层传过来的点击事件 mInputEventReceiver = new WindowInputEventReceiver(mInputChannel, Looper.myLooper()); } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/2 23:25:31

水文在线监测系统 雨量水位自动观测设施

Q1:雨量水位监测站的核心定位是什么?为何能成为水文监测网络关键节点? A:核心定位是“全场景水文要素精准监测终端”,专注解决传统监测“接触式易干扰、测量精度低、适配性弱、运维繁琐”的痛点,聚焦河道、…

作者头像 李华
网站建设 2026/9/2 22:32:08

【软件研发核心工程实践】发布部署策略与性能测试关键技术详解

【精选优质专栏推荐】 《AI 技术前沿》 —— 紧跟 AI 最新趋势与应用《网络安全新手快速入门(附漏洞挖掘案例)》 —— 零基础安全入门必看《BurpSuite 入门教程(附实战图文)》 —— 渗透测试必备工具详解《网安渗透工具使用教程(全)》 —— 一站式工具手册《CTF 新手入门实战教…

作者头像 李华
网站建设 2026/9/2 9:48:33

财务应收账款统计乱?IPA自动汇总客户欠款,催款有目标

应收账款管理优化方案 IPA自动化工具应用 使用智能流程自动化(IPA)工具对接财务系统,自动抓取客户交易数据并生成欠款明细。系统可设置每日或每周自动更新欠款状态,避免人工统计误差。 客户分级催收策略 根据欠款金额和逾期时间…

作者头像 李华
网站建设 2026/9/2 12:54:55

ARM 汇编指令系列文章导读

ARM 汇编指令系列文章导读 欢迎来到我的 ARM 汇编指令系列文章!为了帮助大家系统性地学习 ARM 汇编指令,我创建了这个系列教程。本系列旨在从基础到进阶,逐一剖析 ARM 汇编中常用且重要的指令,帮助读者深入理解其原理与应用场景。…

作者头像 李华
网站建设 2026/9/2 20:59:25

【网安毕设项目】基于深度学习的恶意钓鱼邮件检测系统

摘要:本文设计并实现了一个基于深度学习的钓鱼邮件自动检测系统。系统采用BiLSTM模型对邮件文本进行语义分析,结合文本预处理、词向量表示等技术,实现钓鱼邮件与正常邮件的自动分类。项目构建了完整的数据处理流程和GUI界面,包含数…

作者头像 李华
网站建设 2026/9/2 21:03:33

Thinkphp和Laravel电影院购票商城管理系统的设计与实现_

目录 技术框架选择核心功能模块设计数据库与高并发处理支付与安全实现部署与性能优化 项目开发技术介绍PHP核心代码部分展示系统结论源码获取/同行可拿货,招校园代理 技术框架选择 ThinkPHP和Laravel均为流行的PHP框架。ThinkPHP以轻量级、中文文档丰富著称,适合快…

作者头像 李华