IMS:Activity和View处理InputEvent

news2024/12/24 0:56:45

IMS:Activity和View处理InputEvent

  • 1、IMS服务处理
  • 2、Activity的DecorView界面添加
  • 3、Activity和View处理InputEvent
    • 3.1 InputEventReceiver接收InputEvent
    • 3.2 处理KeyEvent
    • 3.3 处理MotionEvent

android12-release


1、IMS服务处理

关键流程EventHub -> InputReader -> InputDispatcher -> InputChannel/android_view_InputEventReceiver.cpp -> InputEventReceiver.java;查看如下相关文章和时序图

  • InputReader线程获取输入事件-Android12
  • InputDispatcher线程分发事件-Android12
  • InputChannel通道建立-Android12
  • InputChannel发送Input给App-Android12

在这里插入图片描述

2、Activity的DecorView界面添加

关键流程 wm.addView(decor,...) -> WindowManagerGlobal.java#addView -> ViewRootImpl.java#setView -> Session extends IWindowSession.Stub#addToDisplayAsUser -> WindowManagerService.java#addWindow,查看 Activity窗口的添加过程 了解,如下图查看,了解其中PhoneWindow.java是Android-specific Window,实际ViewRootImpl添加DecorView.javaWMS
在这里插入图片描述

3、Activity和View处理InputEvent

3.1 InputEventReceiver接收InputEvent

添加窗口时,ViewRootImpl.javaInputChannel / WindowInputEventReceiver建立联系;通过JNI调用,最终在WindowInputEventReceiver.java#onInputEvent通过InputStage责任链处理InputEvent,可参照1中时序图流程查看代码。

InputStage责任链:SyntheticInputStage - ViewPostImeInputStage - NativePostImeInputStage - EarlyPostImeInputStage - ImeInputStage - ViewPreImeInputStage - NativePreImeInputStageInputStage的各子类Input事件result = onProcess(q)处理,再判断是forward()向下传递,还是finish()结束

  • NativePreImeInputStage: 主要是为了将消息放到NativeActivity中去处理。
  • ViewPreImeInputStage: 最后会调用Acitivity的所有view的onkeyPreIme方法,这样就给View在输入法处理key事件之前先得到消息。
  • ImeInputStage: onProcess(q)处理会调用InputMethodManager的dispatchInputEvent方法处理消息。
  • EarlyPostImeInputStage: 屏幕上有焦点的View会高亮显示,用来提示用户焦点所在。
  • NativePostImeInputStage: 为了让IME处理完消息后能先于普通的Activity处理消息。
  • ViewPostImeInputStage: Acitivity和view处理各种消息。
  • SyntheticInputStage: 流水线的最后一级,经过层层过滤之后,到达这里的消息已经不多了,例如手机上的虚拟按键消息。

Activity和View的事件处理主要对应的InputStage是ViewPostImeInputStage

  • onProcess(q)中处理 KeyEventprocessKeyEvent(q)
  • onProcess(q)中处理 MotionEventprocessPointerEvent(q)、processTrackballEvent(q)、processGenericMotionEvent(q)
@Override
protected int onProcess(QueuedInputEvent q) {
    if (q.mEvent instanceof KeyEvent) {
        return processKeyEvent(q);
    } else {
        final int source = q.mEvent.getSource();
        if ((source & InputDevice.SOURCE_CLASS_POINTER) != 0) {
            return processPointerEvent(q);
        } else if ((source & InputDevice.SOURCE_CLASS_TRACKBALL) != 0) {
            return processTrackballEvent(q);
        } else {
            return processGenericMotionEvent(q);
        }
    }
}

3.2 处理KeyEvent

处理顺序如下:

  1. DecorView传递给Activity#dispatchKeyEvent处理
  2. mFocused窗口的OnKeyListener监听,在处理其onKeyDown()、onKeyLongPress()、onKeyUp()、onKeyMultiple()方法
  3. dispatchUnhandledKeyEvent() 未拦截处理的KeyEvent发送给ViewGroup子View的OnUnhandledKeyEventListener监听
  4. 在处理Activity中的onKeyDown()、onKeyLongPress()、onKeyUp()、onKeyMultiple()方法
  5. 未有任何窗口拦截处理,最后传递PhoneWindow的onKeyDown()、onKeyUp()

在这里插入图片描述

在这里插入图片描述
frameworks/base/core/java/com/android/internal/policy/DecorView.java

public boolean dispatchKeyEvent(KeyEvent event) {
    final int keyCode = event.getKeyCode();
    final int action = event.getAction();
    final boolean isDown = action == KeyEvent.ACTION_DOWN;

    if (isDown && (event.getRepeatCount() == 0)) {
        // First handle chording of panel key: if a panel key is held
        // but not released, try to execute a shortcut in it.
        if ((mWindow.mPanelChordingKey > 0) && (mWindow.mPanelChordingKey != keyCode)) {
            boolean handled = dispatchKeyShortcutEvent(event);
            if (handled) {
                return true;
            }
        }

        // If a panel is open, perform a shortcut on it without the
        // chorded panel key
        if ((mWindow.mPreparedPanel != null) && mWindow.mPreparedPanel.isOpen) {
            if (mWindow.performPanelShortcut(mWindow.mPreparedPanel, keyCode, event, 0)) {
                return true;
            }
        }
    }

    if (!mWindow.isDestroyed()) {
        final Window.Callback cb = mWindow.getCallback();
        final boolean handled = cb != null && mFeatureId < 0 ? cb.dispatchKeyEvent(event)
                : super.dispatchKeyEvent(event);
        if (handled) {
            return true;
        }
    }

    return isDown ? mWindow.onKeyDown(mFeatureId, event.getKeyCode(), event)
            : mWindow.onKeyUp(mFeatureId, event.getKeyCode(), event);
}

frameworks/base/core/java/android/view/KeyEvent.java

public final boolean dispatch(Callback receiver, DispatcherState state,
        Object target) {
    switch (mAction) {
        case ACTION_DOWN: {
            mFlags &= ~FLAG_START_TRACKING;
            if (DEBUG) Log.v(TAG, "Key down to " + target + " in " + state
                    + ": " + this);
            boolean res = receiver.onKeyDown(mKeyCode, this);
            if (state != null) {
                if (res && mRepeatCount == 0 && (mFlags&FLAG_START_TRACKING) != 0) {
                    if (DEBUG) Log.v(TAG, "  Start tracking!");
                    state.startTracking(this, target);
                } else if (isLongPress() && state.isTracking(this)) {
                    try {
                        if (receiver.onKeyLongPress(mKeyCode, this)) {
                            if (DEBUG) Log.v(TAG, "  Clear from long press!");
                            state.performedLongPress(this);
                            res = true;
                        }
                    } catch (AbstractMethodError e) {
                    }
                }
            }
            return res;
        }
        case ACTION_UP:
            if (DEBUG) Log.v(TAG, "Key up to " + target + " in " + state
                    + ": " + this);
            if (state != null) {
                state.handleUpEvent(this);
            }
            return receiver.onKeyUp(mKeyCode, this);
        case ACTION_MULTIPLE:
            final int count = mRepeatCount;
            final int code = mKeyCode;
            if (receiver.onKeyMultiple(code, count, this)) {
                return true;
            }
            if (code != KeyEvent.KEYCODE_UNKNOWN) {
                mAction = ACTION_DOWN;
                mRepeatCount = 0;
                boolean handled = receiver.onKeyDown(code, this);
                if (handled) {
                    mAction = ACTION_UP;
                    receiver.onKeyUp(code, this);
                }
                mAction = ACTION_MULTIPLE;
                mRepeatCount = count;
                return handled;
            }
            return false;
    }
    return false;
}

3.3 处理MotionEvent

待续

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/716869.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【BUUCTF-REVERSE刮开有奖】详解版

这道题是BUUCTF-REVERSE中的一道题目 拿到题目我们直接拖到Exeinfo_PE中查看&#xff0c;发现没有加壳&#xff0c;32位应用程序&#xff0c;打开应用程序看看&#xff1a; 打开是这样&#xff0c;我是没有找到编辑框&#xff0c;那直接拖到IDA中打开看看吧&#xff1a; 打开I…

使用python-opcua 实现modbus网关(2)

我们继续来研究如何使用python-opcua 实现opcua/modbus 网关。 opcua 开发包包含了大量的函数&#xff0c;通过研究opcua/modbus 网关的实现&#xff0c;可以了解这些函数的使用方法。由于函数过多&#xff0c;文章中函数的使用方式可能不尽合理&#xff0c;或者存在错误。希望…

从不同视角绘制三维散点图

import numpy as np from matplotlib import pyplot as plt positive_data arr_feature_pca[y_dbscan_pred ! -1, :] negative_data arr_feature_pca[y_dbscan_pred -1, :] # --------------------------------------- 定义绘图函数 ----------------------------------- d…

华为云函数工作流FunctionGraph新手操作指南

函数工作流&#xff08;FunctionGraph&#xff09;是华为云提供的一款无服务器&#xff08;Serverless&#xff09;计算服务&#xff0c;无服务器计算是一种托管服务&#xff0c;服务提供商会实时为你分配充足的资源&#xff0c;而不需要预留专用的服务器或容量&#xff0c;真正…

CRM的哪些功能对企业最有用?

企业如何在竞争激烈的市场环境中&#xff0c;提高销售效率&#xff0c;管理客户关系&#xff0c;实现业绩增长&#xff1f;适合的CRM客户管理系统就可以帮助很多。Zoho CRM是一款SaaS云端CRM系统&#xff0c;它能够帮助企业管理客户关系&#xff0c;提高销售效率&#xff0c;获…

springboot集成camunda

1、相关软件下载Camunda流程引擎快速入门——Hello World示例 2、由于camunda-modeler最新版本为5.12.0.界面不太一样。 可以安装历史版本4.12.0camunda-bpm camunda-modeler等历史版本下载 3、汉化Camunda Modeler汉化添加简体中文和繁体中文支持 4、集成如何实现Springbootca…

Android Studio实现内容丰富的安卓高校评教系统

如需源码可以添加q-------3290510686&#xff0c;也有演示视频演示具体功能&#xff0c;源码不免费&#xff0c;尊重创作&#xff0c;尊重劳动。 项目编号114 1.开发环境 android stuido jdk1.8 eclipse mysql tomcat 2.功能介绍 安卓端&#xff1a; 1.注册登录 2.查看公告 3.查…

口语理解任务源码详解系列(一)数据集构建

口语理解任务源码详解系列&#xff08;一&#xff09;数据集构建 写在前面 本系列从零开始构建口语理解项目&#xff0c;整个项目分为意图分类与槽位填充两个子任务。项目采用的数据集为ATIS航空领域口语理解数据集&#xff0c;项目源码请传送到&#xff1a;github 一、处理数据…

网络编程1—— IP地址 + 端口号 +TCP/IP协议 + 协议分层的封装与应用

文章目录 前言一、网络发展各阶段二、网络通信的三大要素1.IP地址2.端口号3.网络协议 三、TCP/IP五层网络模型各层级的用处网络设备所在分层 四、封装和分用封装分用网络传输的实际情况 总结 前言 本人是一个刚刚上路的IT新兵,菜鸟!分享一点自己的见解,如果有错误的地方欢迎各…

搞懂推荐系统中的评价指标NDCG(CG、DCG、IDCG)

这些指标都是衡量搜索引擎算法的指标。搜索引擎一般采用PI&#xff08;peritem&#xff09;的方式进行评测&#xff0c;简单地说就是逐条对搜索结果进行分等级的打分。假设我们现在在Google上搜索一个词&#xff0c;然后得到5个结果。我们对这些结果进行3个等级的区分&#xff…

cmd可以用node但是vscode报错--node : 无法将“node”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。

原因&#xff1a;环境变量配置错误 解决&#xff1a; a.如果不想配置环境变量&#xff0c;可用管理员方式运行vscode后&#xff0c;重启编译器&#xff1a; 若以上方法不行&#xff0c;需要老老实实配置环境变量&#xff1a; b.配置 系统环境变量&#xff08;S&#xff09; 即…

机器学习20:嵌入-Embeddings

嵌入&#xff08;Embeddings&#xff09;是一个相对低维的空间&#xff0c;我们可以将高维向量转换到其中。嵌入使得对大型输入&#xff08;例如表示单词的稀疏向量&#xff09;进行机器学习变得更加容易。理想情况下&#xff0c;嵌入通过将语义相似的输入紧密地放置在嵌入空间…

高中生用台灯哪种好?盘点好用的高中生护眼台灯

随着科技的进步&#xff0c;台灯的外观和造型都开始不断的变化&#xff0c;而且台灯的功能也越来越多元化&#xff0c;各式各样的台灯都有。论哪种台灯最适合高中生使用&#xff0c;我的回答是护眼台灯&#xff01;因为台灯的主要作用就是照明&#xff0c;便于学习、阅读、工作…

基于Springboot+Vue的手机商城(源代码+数据库)081

基于SpringbootVue的手机商城(源代码数据库)081 一、系统介绍 本项目前后端分离&#xff08;该项目还有ssmvue版本&#xff09; 本系统分为管理员、用户两种角色 用户角色包含以下功能&#xff1a; 登录、注册、商品搜索、收藏、购物车、订单提交、评论、退款、收货地址管…

2023年5月 少儿编程 中国电子学会图形化编程等级考试Scratch编程一级真题解析(选择题)

2023年5月scratch编程等级考试一级真题 选择题(共25题,每题2分,共50分) 1、看图找规律,请问下图红框中是 A、 B、 C、 D、 答案:D 考点分析:

DS-font

paper:https://arxiv.org/pdf/2301.10008.pdf title: Few-shot Font Generation by Learning Style Difference and Similarity accepted: arXiv 2023 abstract 少镜头字体生成(FFG)旨在保留原始字符的底层全局结构,同时通过参考一些样本生成目标字体。它已应用于字体库创…

怎么解决找不到msvcp120.dll,msvcp120.dll一键修复方法

小伙伴们知道msvcp120.dll是什么文件吗?那么今天小编就来讲解电脑出现msvcp120.dll丢失的解决方法介绍&#xff0c;希望能够帮助到大家呢。 msvcp120.dll 是windows系统中必备的动态链接库文件。msvcp120.dll可以解决某些大型游戏、程序由于vs2010编译系统中缺失此dll的问题。…

R 语言的安装(详细教程)

文章目录 前言一、R 语言是什么&#xff1f;二、R 下载1. 官网2. download base3. download Rtools 三、Rstudio 下载1. 官网2. download Rstudio 四、R 安装五、Rtools 安装六、Rstudio 安装七、java 的环境配置八、运行 RStudio十、R 包安装策略1. 配置镜像1. 修改配置文件1.…

Microsoft遭遇DDoS攻击,3000万客户数据遭窃

6月初&#xff0c;微软部分服务遭遇严重中断&#xff0c;包括Outlook电子邮件、OneDrive文件共享应用程序和云计算基础设施Azure。 一个名为”匿名苏丹”的(又名“风暴-1359”)的组织声称对此次DDoS攻击负责。 匿名苏丹组织自2023年1月以来一直活动频繁&#xff0c;声称其目标…