Android 输入法框架流程

输入法框架流程梳理

输入法框架构成

  1. 输入法管理端(IMMS/InputMethodManagerService)
    主要负责输入法服务端与客户端的绑定;输入法的切换/显示/隐藏/启用/关闭。
  2. 输入法服务端(IMS/InputMethodService)
    输入法服务(Service),输入法界面实现,控制字符输入,例如:搜狗输入法。
  3. 输入法客户端(IMM/InputMethodManager)
    每个App都持有一个IMM,主要负责向IMMS注册Client;发起输入法绑定等。
  4. IInputMethodSession
    在IMMS启动IMS时,由IMS创建。在bind时传递给IMM,主要负责向IMS报告以下事件:updateSelection,updateCursor等
  5. IIputContext(InputConnection)
    在View焦点变更时,有IMM创建。在startInput时传递给IMS,主要负责向IMM提交以下事件:commitText,sendKeyEvent等。

IMMS和IMS初始化过程

IMMS由SystemServer启动,启动后会读取Settings中设置的默认输入法,随后bindService IMS-service,返回IInputMethod。
IMMS绑定IMS成功后,会创建token并注册到WindowManagerSerivce,此token是IMS中window的标识,方便WMS和IMMS管理。
随后在onServiceConnected回调中将token回传给IMS,IMS向SoftInputWindow设置token。
此时可能没有IMM,创建IInputMethodSession逻辑将在IMM连接时再执行。

IMM初始化过程

IMM的初始化从添加Window开始,每次添加window时会实例化ViewRoot,ViewRoot在获取IWindowSession时会初始化IMM。
将IMM注册到IMMS中,并创建IWidow,等待焦点更新。

IMM和IMS绑定

当View收到焦点更新,会调用IMM的focusIn方法。之后IMM创建IInputContext,并将其传递到IMMS,
再之后IMMS通过WMS检测焦点,通知IMS创建IInputMethodSession。
当IMMS获得IMS的session后开始绑定IMM和IMS,在MSG_BIND_METHOD消息中将IInputMethodSession传给IMM,在MSG_START_INPUT消息中将IInputContext传给IMS,IMM和IMS拿到各方代理,通讯通道建立成功。

显示输入法

在焦点更新时,会调用IMMS的windowGainFocus方法显示输入法,经过IMMS对焦点属性的检测,最终会调用IMS的showSoftInput方法,之后在showWindow方法中将SoftInputWindow显示出来。

输入法传递文本给View

输入法的输入消息分为按键消息和触屏消息

  1. 按键消息会传递到App窗口对应的ViewRoot中,通过IMM传递到IMS,IMS会将该按键消息转换为虚拟按键消息,通过词库的翻译将内容通过IInputContext回传到相应的EditText显示。
  2. 触屏消息是触摸输入法窗口View,将触摸消息转换成虚拟按键消息,通过词库的翻译将内容通过IInputContext回传到相应的EditText显示。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++面试50题】

以下是针对C程序员面试可能遇到的一些问题,涵盖了从基础语法、面向对象、STL、内存管理、模板、异常处理、并发编程等多个方面。 ### 基础概念与语法 1. C与C的主要区别是什么? 2. 什么是构造函数和析构函数?它们何时被调用? 3. 什…

JDK版本特性(JDK8\11\17\21版本)

JDK版本特性 Oracle官网https://www.oracle.com/java/technologies/java-se-support-roadmap.html Oracle官网中JDK版本的说明,Java SE 8、11、17和21是LTS版本。也就是长期支持版本。 我们针对这几个版本了解学习下对应版本的新特性。 JDK8版本 正式发布于2014…

XCP协议系列介绍02-基于ASAP2 Tool-Set生成A2l介绍

本文框架 1. 前言2. ASAP2 Tool-Set系统介绍2.1 ASAP2 Creator介绍2.2 ASAP2 Updater介绍2.3 ASAP2 Merger介绍2.4 ASAP2 Comparer及Checker介绍2.5 ASAP2 Modifier介绍2.6 ASAP2 Studio介绍 3. 项目实操说明3.1 项目实操建议3.2 工具下载地址及使用 1. 前言 在XCP观测及标定整…

【自撰写,国际象棋入门】第1课、棋盘和棋子

第1课 棋盘和棋子 一、国际象棋的棋盘 国际象棋的棋盘为一8乘8的黑、白格相间的棋盘,8条竖线的编号分别为A-H,8条横线的编号分别为1-8,在记谱时用竖线编号横线编号的方式表示棋盘上的格子,例如a1格、h8格等.棋盘上有几条重要的大…

抖音 UG 社招一面算法原题

史上最严热点新机制 或许是受到前段时间「巴黎丢作业」的影响,抖音近日(5月27日)实施了新的热点内容核实机制。 具体来说,若用户在抖音以热点事件当事人身份发声,抖音将联系当事人进行身份认证。 逾期未认证的用户&…

基于springboot实现网络海鲜市场系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现网络海鲜市场系统演示 摘要 计算机网络发展到现在已经好几十年了,在理论上面已经有了很丰富的基础,并且在现实生活中也到处都在使用,可以说,经过几十年的发展,互联网技术已经把地域信息的隔阂给消除…

STM32作业实现(六)闪存保存数据

目录 STM32作业设计 STM32作业实现(一)串口通信 STM32作业实现(二)串口控制led STM32作业实现(三)串口控制有源蜂鸣器 STM32作业实现(四)光敏传感器 STM32作业实现(五)温湿度传感器dht11 STM32作业实现(六)闪存保存数据 STM32作业实现(七)OLED显示数据 STM32作业实现(八)触摸按…

大学生Python自救课程总结

因为一些事情的缘故,我已经几乎没有更新很久了,然后现在快到期末了,不知道各位学习python的同志们慌不慌【坏笑】。 本学期,我只是简单的讲了讲python的基础用法。当然,可能有些地方总结的并不全面,很多知…

MyBatis 的在使用上的注意事项及其辨析

1. MyBatis 的在使用上的注意事项及其辨析 文章目录 1. MyBatis 的在使用上的注意事项及其辨析2. 准备工作3. #{ } 与 ${ } 的区别和使用3.1 什么情况下必须使用 ${ }3.1.1 拼接表名3.1.2 批量删除3.1.3 模糊查询3.1.3.1 使用 ${ }的方式3.1.3.2 使用 #{ } 的方式 4. typeAlias…

童心与美食的邂逅,蒙自源邀你共绘梦想画卷

激情夏日所带来的热情如同孩子们的梦想一样炽热而澎湃。为了庆祝六一儿童节,从5月25日起,蒙自源旗下各大门店准备了一系列的活动,以迎接这个属于孩子们的特别日子。 特别活动期间,蒙自源特意为孩子们推出了一系列独具特色的美食。…

Cobalt_Strike(CS)渗透工具安装使用到免杀上线

Cobalt_Strike(CS)安装到免杀上线 原文链接: cs免杀上线 点我 https://mp.weixin.qq.com/s?__bizMzkxNDY5NzMxNw&mid2247483862&idx1&snc6b4da3ce5772a075431098227397baa&chksmc16b3cdcf61cb5ca06f61513…

Flutter开发效率提升1000%,Flutter Quick教程之在特定位置插入Widget

当我们要将Widget插入一个Column,Row或者Listview等有多个子元素的Widget的时候,有两种情况,一种是顺序插入,一种是非顺序插入。顺序插入就是Widget的排列顺序和插入顺序相同,非顺序插入则不是。 一,顺序插入。如图所…

树莓派通过PCA9685控制FT2331M舵机(Python)

很久之前整过PWM舵机,刚好最近师弟需要,并且网上现有教程不是很完整,就整理一下。方便交流以及后面回顾。 首先要明确,在这个控制方式中需要用到哪些方面: 1、树莓派与PCA9685之间使用I2C通信 2、PCA9685通讯协议 3…

牛客网刷题 | BC113 数字三角形

目前主要分为三个专栏,后续还会添加: 专栏如下: C语言刷题解析 C语言系列文章 我的成长经历 感谢阅读! 初来乍到,如有错误请指出,感谢! 描述 KiKi学习了循环&am…

【Text2SQL 论文】DBCopilot:将 NL 查询扩展到大规模数据库

论文:DBCopilot: Scaling Natural Language Querying to Massive Databases ⭐⭐⭐⭐ Code: DBCopilot | GitHub 一、论文速读 论文认为目前的 Text2SQL 研究大多只关注具有少量 table 的单个数据库上的查询,但在面对大规模数据库和数据仓库的查询时时却…

RHEL7.9修改分区

系统RHEL7.9 他因为安装软件,需要修改分区 进入超级用户root,输入lsblk 查看分区,可见465.8G系统盘sda下有三个物理卷,其中sda3下/home有410.6G,需要这部分拆分出200G软件和100G的数据库分区 备份/home 目录下文件 c…

自动化办公02 用openpyxl库操作excel.xlsx文件(新版本)

目录 一、文件读操作 二、文件写操作 三、修改单元格样式 openpyxl 是一个处理Excel表格的第三方库。openpyxl 库可以处理Excel2010以后的电子表格格式,包括:xlsx/xlsm/xltx/xltm。 openpyxl教程 一、文件读操作 工作簿(workbook): excel文件 工作表…

LNMP网站架构部署

目录 一、LNMP架构部署(源码编译安装) ①实验准备 ②安装nginx服务 ③安装mysql服务,配置文件 ④安装php服务,修改配置文件 ⑤验证 静态页面测试访问 动态页面测试访问 调用数据库测试 二、LNMP架构应用实例 1.论坛网站…

南京观海微电子---简单驱动电路设计用NMOS防反接,性价比比较高?

来看看NMOS的防反保护电路有什么不同? 简单的栅极驱动电路设计,我们会使用NMOS来作防反电路,原因是成本较低。 PMOS一般会放置在电路的高边,NMOS则是在低边放置。两者的功能类似。不过,NMOS的防反结构,它…

..\MYLIB\modbus.c(49): error: #84: invalid combination of type specifiers

在keil中添加相应的文件出现以下问题时 ..\MYLIB\modbus.c(49): error: #84: invalid combination of type specifiers 是由于:在定义的函数体的前面有一个变量类型