news 2026/10/10 2:57:17

InputStage 责任链核心执行流程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
InputStage 责任链核心执行流程

一句话总结

InputStage是 Android 输入事件分发中的责任链处理器,输入事件从链头开始依次经过每个 Stage,每个 Stage 决定自己处理还是传给下一个。


1. 事件入口

// ViewRootImpl.javavoiddeliverInputEvent(QueuedInputEventq){InputStagestage;if(q.eventinstanceofKeyEvent){stage=mFirstInputStage;// 按键事件:走按键链}else{stage=mFirstPostImeInputStage;// 触摸事件:走触摸链}stage.deliver(q);}

代码分析

  • ViewRootImpl收到输入事件后,只负责选链头,不直接处理事件。
  • 按键事件和触摸事件走不同的责任链,因为两者的处理阶段不同。
  • stage.deliver(q)把事件交给链头,正式启动责任链传递。

2. InputStage 基本结构

// InputStage.javaabstractclassInputStage{privatefinalInputStagemNext;// 链上的下一个 StageprotectedInputStage(InputStagenext){mNext=next;}publicfinalvoiddeliver(QueuedInputEventq){if((q.mFlags&QueuedInputEvent.FLAG_FINISHED)!=0){finish();// 事件已被消费,直接结束}else{onProcess(q);// 交给当前 Stage 处理}}protectedabstractintonProcess(QueuedInputEventq);protectedvoidforward(QueuedInputEventq){if(mNext!=null){mNext.deliver(q);// 传给下一个 Stage}else{finish();// 到达链尾,结束}}}

代码分析

  • mNext是链表指针,把所有 Stage 串成一条链。
  • deliver()是统一入口:先判断事件是否已被消费,没有则进入当前 Stage。
  • onProcess()是抽象方法,由具体子类实现各自的处理逻辑。
  • forward()负责把事件接力传下去,如果没有下一个就结束。

3. Stage 怎么处理事件

// InputStage.javaprotectedvoidonProcess(QueuedInputEventq){intresult=onProcess(q);if(result==FINISH_HANDLED){// 消费了事件,停止传递finish();}elseif(result==FORWARD){// 不处理,交给下一个 Stageforward(q);}}

代码分析

  • 子类返回两个核心状态:
    • FINISH_HANDLED:我处理了,事件到此结束。
    • FORWARD:我处理不了,继续往下传。
  • 这是一种典型的责任链模式:每个节点尝试处理,不处理就转发。

4. 看一个具体子类

// ViewPostImeInputStage.java(简化版)finalclassViewPostImeInputStageextendsInputStage{publicViewPostImeInputStage(InputStagenext){super(next);}@OverrideprotectedintonProcess(QueuedInputEventq){if(q.eventinstanceofMotionEvent){// 触摸事件交给 View 树分发returnprocessPointerEvent(q);}if(q.eventinstanceofKeyEvent){// 按键事件交给 DecorView 处理returnprocessKeyEvent(q);}returnFORWARD;// 都不是,传给下一个 Stage}privateintprocessPointerEvent(QueuedInputEventq){MotionEventevent=(MotionEvent)q.event;booleanhandled=mView.dispatchPointerEvent(event);returnhandled?FINISH_HANDLED:FORWARD;}}

代码分析

  • ViewPostImeInputStage负责把事件交给视图树处理。
  • onProcess()中根据事件类型分别处理,不能处理就返回FORWARD。
  • processPointerEvent()把触摸事件派发给mView,由 View 树决定谁消费。
  • 如果 View 树消费了,返回FINISH_HANDLED,链停止;否则继续传递。

5. 责任链是怎么串起来的

// ViewRootImpl.java(简化版)mFirstInputStage=newNativePreImeInputStage(newViewPreImeInputStage(newImeInputStage(newViewPostImeInputStage(newNativePostImeInputStage(newSyntheticInputStage())))));

代码分析

  • 通过构造函数的嵌套,把多个 Stage 串成一条链。
  • 链头是NativePreImeInputStage,链尾是SyntheticInputStage。
  • 每个 Stage 的mNext就是构造函数传入的下一个 Stage。
  • 事件进入链头后,按顺序依次经过每个 Stage。

6. 完整执行流程

事件进入 deliver() │ ▼ 当前 Stage.deliver() │ ├── 已消费 → finish() → 结束 │ └── 未消费 → onProcess() │ ├── FINISH_HANDLED → finish() → 结束 │ └── FORWARD → forward() → mNext.deliver() │ ▼ 到达链尾 → finish() → 结束

7. 总结

要点说明
模式责任链模式
入口ViewRootImpl.deliverInputEvent()
传递InputStage.forward()调用mNext.deliver()
消费某个 Stage 返回FINISH_HANDLED即停止传递
链尾无mNext时调用finish()结束

理解InputStage就是理解一条流水线:输入事件从链头流进,每个 Stage 看一眼,能处理就留下,不能处理就往下传,直到有人处理或流到末尾。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/10 2:57:02

安徽皖上好影视制作公司 擅长人物传记片、活动花絮视频的创意制作

影视制作行业发展态势与皖上好的业务定位随着数字化传播时代的全面到来,视频内容已经成为政企单位与商业品牌对外展示形象、传递价值的核心载体。无论是政务宣传、校园文化传播,还是企业品牌推广、活动记录留存,人物传记片与活动花絮视频的需…

作者头像 李华
网站建设 2026/10/10 2:56:54

导师要收作业,群里文件满天飞?一个链接搞定全班文件收集

一、场景还原:收一次作业到底有多痛苦 如果你当过课代表、助教、或者负责收集团队材料的人,下面这些场景你一定不陌生: 在微信群里发了一条「请大家把作业发给我」,然后手机开始震动,40 个文件陆续涌来,你一…

作者头像 李华
网站建设 2026/10/10 2:56:44

cpu_dev_init 函数

cpu_dev_init 函数1. cpu_dev_init 函数1.1 subsys_system_register / subsys_register 函数1.2 cpu_dev_register_generic 函数1. cpu_dev_init 函数 初始化cpu_subsys结构体 创建/sys/bus/cpu目录,并将其插入到链表中 创建/sys/bus/cpu/devices 目录 创建/sys/bus…

作者头像 李华
网站建设 2026/10/10 2:56:40

2D-CFAR雷达二维信号恒虚警检测:原理、MATLAB实现与参数标定

简介:面向雷达信号处理课程设计与MATLAB仿真实践者,资源提供了基于二维恒虚警检测(2D-CFAR)的完整MATLAB仿真实现,覆盖发射信号生成、目标回波模拟、距离-多普勒处理及CFAR检测判决等关键环节。代码基于MATLAB R2022a编…

作者头像 李华
网站建设 2026/10/10 2:56:31

MySQL自定义排序全解析:FIELD、CASE WHEN、中文排序与性能调优

在实际的数据库开发中,MySQL自定义排序是个看着简单、做起来全是门道的话题。默认的ORDER BY升序降序在大多数业务场景里都只能算“能出结果”,远远称不上“符合业务逻辑”。订单要按“待付款、待发货、已签收、已取消”的状态顺序展示,CMS后…

作者头像 李华
网站建设 2026/10/10 2:56:05

企业选用AI智能体,不同实现方式有什么优缺点

摘要:不少企业再引入AI智能体的时候,容易把关注点只放在功能能力上,忽略AI智能体部署在公司的实现模式差异。同样一套智能体业务能力,选择SaaS、混合云、本地化私有化,会直接改变成本、数据安全、运维压力。本文站在一…

作者头像 李华