输入法开发解析_选择一款你熟悉的输入法软件,提取功能点,谈谈你对输入法开发的认识-程序员宅基地

技术标签: android 后台功能  输入法  平台  service  android  ophone  框架  

Android平台自1.5版本之后开放了输入法框架(Input Method Framework,IMF),IMF是Android平台的特色设计。它的出现,为诞生不带实体键盘的设备提供了可能。同时,IMF开放了Android平台输入法的开发接口,为Android平台的输入法提供了可扩展性。

OPhone平台继承了Android平台的输入法框架。本文首先介绍OPhone平台IMF的构成、工作机制和流程,以便广大开发者能够更好的理解OPhone平台是如何实现文字输入。接下来,将以一个简单的例子,介绍如何进行简单的输入法开发,开发者应该可以对OPhone平台的输入法开发形成一个初步的认识。
 
1.OPhone平台IMF简介
OPhone平台的IMF按照功能分为三个主要模块,分别为:客户端控件,输入法服务(IMMS),以及输入法应用(IME)。如果要深刻的理解和掌握OPhone平台的输入法开发技巧,那么必须要了解OPhone平台IMF内部各个模块之间的工作机制。
 
客户端控件,是指具有文字编辑功能的系统控件(如EditText),是平台内部输入法应用人机交互的起点。输入法服务,是OPhone平台的底层基础服务之一,负责管理输入法,包括输入法的安装、注册、激活等。输入法应用,则是指平台内预置,或者后续安装的输入法程序。三个模块间的交互关系如下:
下面我们将分别介绍以上三个模块,并简要介绍各模块内主要使用的对象和服务。
1.1客户端控件
 
OPhone平台的客户端控件主要是TextView及其子类。客户端控件是输入法人机交互的起点。客户端控件与输入法服务和输入法应用都有交互操作。
以EditText为例,当客户端控件接受到焦点时,控件启动输入法应用并显示键盘;而失去焦点时,则隐藏键盘。另外,EditText控件收到长按事件时,弹出输入法选择菜单。这类操作属于客户端控件与输入法服务间的交互。
此外,客户端控件还可以向输入法应用传递文本状态,包括光标位置、文本选择等;接受并显示输入法应用反馈的输入文字。这类交互属于客户端控件与输入法应用的交互。
客户端控件对输入法服务和输入法应用的操作,都是通过对InputMethodManager实例的调用来实现的。InputMethodManager更像是一个供客户端控件使用API操作的集合,定义对输入法应用以及输入法服务的一系列操作。客户端控件会通过
 
InputMethodManager.peekInstance() 来获取唯一的实例。
需要指出的是,各调用函数的具体操作并不是在InputMethodManager中具体实现的。OPhone平台的输入法框架定义了IIputMethodManager接口和IIputMethodSession接口分别定义了对输入法服务和输入法应用的操作。而InputMethodManagerService和InputMethodService则分别对这两个接口进行了具体的实现。这样通过AIDL机制,客户端控件便可以跨进程的调用其他service内的实现。
通过这样的机制,OPhone平台降低了输入法框架内各个模块间的耦合性,并且保证了输入法应用的可扩展性。客户端无需知道使用的是那一款输入法,从而实现了简单直接的控制。
另外还需要指出的,客户端控件通过IIputMethodSession对于输入法应用的交互是单向的,即只能向输入法应用传递信息,无法获取信息。客户端应用从输入法应用获取信息是通过InputConnection来实现的, 在启动输入法时,InputConnection由客户端控件创建,并传递给输入法应用,由输入法应用调用,进行信息反馈。
 
1.2输入法服务
 
输入法服务作为平台底层的一项基础服务,用来管理输入法应用。输入法服务的主要工作由InputMethdoManagerService(IMMS)完成。下面简要的介绍输入法服务如何实现输入法的安装、切换。
  •  输入法安装
IMMS内部包含一个receiver,注册接收所有程序包安装、卸载的消息。当收到此类消息后,IMMS会通过系统的PackageManager查询所有声明为InputMethod的程序,并生成一个系统可用的输入法列表,供用户选择使用。
  • l输入法切换
当用户选择了一款输入法后,IMMS将此输入法的ID保存为系统的默认输入法ID。这里的ID是该输入法在IMMS内维护的可用输入法列表中的位置ID。
当客户端通过InputMethodManager启动输入法应用时,IMMS将根据这个ID从输入法列表中取出输入法,并加载使用。
 
1.3输入法应用
 
输入法应用是具体处理用户输入行为的应用程序。为了能够在OPhone的输入法框架中良好的运行,所有的输入法应用都需要继承特定的service。OPhone平台的输入法框架为输入法应用定义了一个基类InputMethodService。InputMethodService提供了一个输入法的标准实现。定义了输入法生命周期内的重要函数,提供给开发人员进行相应的处理。
为了帮助开发者了解输入法应用的工作流程。我们首先看一下输入法应用的生命周期:
  •  当用户触发输入法显示的时候(客户端控件获得焦点),InputMethodService启动。首先调用onCreate() 函数,该函数在输入法第一次启动的时候调用,适合用来做一些初始化的设置,与其他service相同;
  •  调用onCreateInputView() 函数,在该函数中创建KeyboardView并返回;
  •  调用onCreateCandidatesView()函数,在该函数中创建候选区实现并返回;
  •  调用onStartInputView()函数来开始输入内容,
  •  输入结束后调用onFinishInput()函数来结束当前的输入,
  •  如果移动到下一个输入框则重复调用onStartInputView和onFinishInput函数;
  •  在输入法关闭的时候调用onDestroy() 函数。
 
InputMethodService实现了两个重要的接口,InputMethod和InputMethodSession。
  •  InputMethod
InputMethod接口定义了一套操纵输入法应用的方法。如,bindInput, hideInput, startInput等。为了系统安全,这类接口只有系统可以访问,客户端控件无法直接调用这个接口。所有的输入法应用都需要客户端控件具有BIND_INPUT_METHOD权限,作为系统的安全机制,否则将无法与输入法服务交互。
  •  InputMethodSession
InputMethodSession作为InputMethod的辅助接口类,为客户端控件开放了可直接调用的函数接口。包括向输入法应用分发键盘事件,更新光标位置,更新编辑区域内选择的问题信息等。
 
2.OPhone平台输入法开发方法
通过对OPhone平台输入法框架的介绍,相信大家已经初步了解了OPhone平台内输入法相关模块间的交互和工作机制。
OPhone平台内的输入法开发主要包括上层界面UI的开发,以及底层输入法引擎的开发。本文所介绍的开发技术包括如何在OPhone平台下如何构建输入法应用,如何设计键盘,进行界面开发。
值得说明的是,输入法的很多核心功能都是体现在底层输入法引擎中的。输入法引擎的功能包括根据输入字符获取候选词以及联想词,调整管理词库词频等等。简而言之,输入法引擎是一个语言邻域专用的数据库引擎,根据用户按键输入,在语言数据库中查询出候选,供用户选择。这些与OPhone平台的开发是相互独立的,在此不做细致的说明。
下面我们以简单的实例,说明如何开发一个OPhone平台的输入法应用。
 
2.1.配置服务
输入法应用在OPhone系统中是一个service。与其他service一样,输入法需要通过在AndroidManifest.xml中进行service定义。示例如下:
  1. <application android:label="@string/english_ime_name">  
  2.         <service android:name="LatinIME"  
  3. android:label="@string/english_ime_name"     
  4. android:permission="android.permission.BIND_INPUT_METHOD">  
  5.             <intent-filter>  
  6.                 <action android:name="android.view.InputMethod" />  
  7.             </intent-filter>  
  8.             <meta-data   
  9. android:name="android.view.im"   
  10. android:resource="@xml/method" />  
  11.         </service>  
  12. </application>  
 
该service具有BIND_INPUT_METHOD权限,表明这是一个输入法服务。在intent-filter中使用android.view.InputMethod action来定义,最后通过name为android.view.im的meta-data来描述该输入法的一些属性,meta-data引用的是一个XML文件,该文件是输入法的配置文件,用来配置一些信息,例如是否为默认输入法,是否具有配置Activity来配置输入法的一些选项,如果指定了配置Activity则在系统设置界面中的输入法设置中可以启动该Activity来设置输入法的配置项。
 
2.2继承InputMethodService
通过扩展android.inputmethodservice.InputMethodService可以很容易的实现一个输入法服务,InputMethodService提供了一些系统回调函数,可以按照需要来实现。上面已经进行了详细的解析,再此不做过多赘述。
构成一个输入法应用,最重要的界面元素包括软键盘区域和候选词区域。InputMethodService为这两个区域设置了专门的回调函数,以便开发者灵活的定制并加载资源文件。下面针对这两个区域的回调函数,做一个简单的介绍。
 
2.2.1 onCreateInputView
该函数在输入区域,(比如虚拟键盘)第一次被显示的时候被调用,仅调用一次。显示的View通过return返回,默认的返回是null,当返回为null时,什么也不显示。
生成输入区域的View通过LayoutInflater加载Layout中的资源文件来实现。在资源文件中或者是一个KeyboardView或者是由若干个KeyboardView组成的Container。
通常在这个函数中都需要注册键盘事件的监听器setOnKeyboardActionListener。这个监听器用来处理以下键盘事件:
onKey(int primaryCode, int[] keyCodes)
onPress(int primaryCode)
onRelease(int primaryCode)
 
2.2.2 onCreateCandidatesView
该函数在联想词条第一次被显示的时候调用,仅调用一次。显示的View通过return返回。如果没有联想条,则返回null。
构造联想词条,通过LayoutInflater来加载资源文件,生成View。
 
2.3软键盘区域
在OPhone 平台中软键盘是很容易实现的,通过Keyboard 类可以创建软键盘,该类从XML文件中读取软键盘信息。软键盘信息包括有多少行,每行有多少按键,每个按键代表什么内容等等。
 
2.3.1 Keyboard
Keyboard通过加载XML文件,构建虚拟键盘。XML文件的内容示例如下:
 
  1. <Keyboard   
  2.     android:keyWidth="10%p"  
  3.     android:horizontalGap="0px"  
  4.     android:verticalGap="0px"  
  5.     android:keyHeight="@dimen/key_height"<!—在Value中预定义的常量-->   
  6.     >  
  7.     <Row android:verticalGap="@dimen/key_padding">  
  8.         <Key android:codes="113" android:keyLabel="q" android:keyEdgeFlags="left" android:popupKeyboard="@xml/kbd_popup_template"  
  9. android:popupCharacters="@string/alternates_for_q"/>  
  10. ……  
  11. </Row>  
 
borqs:keyWidth,borqs:horizontalGap,borqs:verticalGap,borqs:keyHeight分别用来表示横向纵向的间距以及按键长宽。
Row用来表示行,每行包括若干Key。最左侧和最右侧的Key需要用android:keyEdgeFlags标示。android:popupKeyboard和android:popupCharacters用来标示按键后弹出的小键盘的资源id和显示的文字。
填写完成构建键盘的XML文件后,需要编写一个类来进行具体的操作处理。这个类继承自Keyboard类。在这个类中,需要实现的方法有:
l 构造函数:通过构造函数加载键盘资源文件
 
2.3.2 KeyboardView
KeyboardView用来渲染一个虚拟键盘,并监控键盘上面的点击和触摸事件。输入法应用需要构建一个继承自KeyboardView的键盘视图类。在这个类中处理所有来自键盘的事件。
重要的函数包括:
l setKeyboard:用来绑定Keyboard和KeyboardView。
l onLongPress:用来处理长按事件
在KeyboardView中有一个监听器——OnKeyboardActionListener。通过这个函数可以获得此键盘视图的监听器。监听器通过OnKey函数分发处理键盘点击事件。
l getKeyboard:通过此函数获取和view绑定的键盘类
 
2.4候选词区域
对于中文输入法来说候选区域是一个特别重要的内容,拿拼音输入法来说用户输入拼音会出现多个候选词语,通过对候选词语的合理安排是一个输入法是否好用的重要评判标准之一。但是也有特殊情况下不需要候选区域的,例如输入数字或则密码。候选区域通过继承View实现。
 
2.4.1 CandidateView
候选栏不同于键盘,OPhone输入法框架中没有为他封装特定的类。输入法候选栏需要集成View,独立实现。
在这个类中,要处理所有点击在候选栏的操作。包括点击候选词的操作。输入法应用在初始化时,会将自己的引用或者专门用来处理点击候选词操作的listener传递给CandidateView中。具体的选中候选词的操作要通过调用输入法应用服务内部的函数完成。
CandidateView中一个重要的函数是onDraw(),通过此函数绘画候选栏。CandidateView中需要设置用来保存候选词页数的变量,通过页数,计算候选词显示的词语个数,已调整宽度。通过Canvas的drawText方法写出各候选词条。
CandidateView中还可以定义一个PopupWindow用来显示点中后弹出的文字内容。这个弹出窗口可以在CandidateView中构建,也可以由CandidateContainer传递进来。
 
2.4.2 CandidateContainer
之所有构建一个容器,是为了保存多个CandidateView。候选词条上的左右方向的翻页按钮,也是通过这个容器来管理的。这个类不是OPhone平台框架实现的类,借鉴了Android平台自带的LatinIME,我认为这是一个不错的实现方式。细化了CandidateView的功能,处理了除候选词外的其他逻辑操作。
另外使用CandidateContainer还有一个优点,即,通过保存两个CandidateView,翻页处理时可以马上显示,而不需要重新加载,提高了显示效率。CandidateContainer是通过ViewFlipper来管理多个View的。
 
3. 总结:
 从以上对于输入法框架的介绍,以及输入法开发方法的介绍可以看出,OPhone平台提供的良好的输入法框架可以很方便的开发第三方输入法,开发者只需要关注于输入法的业务逻辑实现,界面部分交给OPhone来做就可以了,这样可以极大的节省开发人员的精力和开发成本。
对于目前流行的大屏幕触摸屏智能终端,输入法应用的功能以及人机交互流程的设计,很大程度上影响着终端的用户体验。可以说输入法是大屏幕触摸屏智能终端最重要的应用模块之一。OPhone平台在不断改造输入法应用的同时,也开放了平台的输入法模块的开发合作,为广大开发者以及专业厂商创造了参与OPhone平台输入法开发的机会。
 
作者介绍
夏博,中国移动通信研究院终端技术研究所终端软件工程师,OPhone平台开发组成员,目前主要负责IME、layout、Widget等平台能力的开发、维护与管理工作。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zhjp4295216/article/details/5889892

智能推荐

分布式光纤传感器的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告_预计2026年中国分布式传感器市场规模有多大-程序员宅基地

文章浏览阅读3.2k次。本文研究全球与中国市场分布式光纤传感器的发展现状及未来发展趋势,分别从生产和消费的角度分析分布式光纤传感器的主要生产地区、主要消费地区以及主要的生产商。重点分析全球与中国市场的主要厂商产品特点、产品规格、不同规格产品的价格、产量、产值及全球和中国市场主要生产商的市场份额。主要生产商包括:FISO TechnologiesBrugg KabelSensor HighwayOmnisensAFL GlobalQinetiQ GroupLockheed MartinOSENSA Innovati_预计2026年中国分布式传感器市场规模有多大

07_08 常用组合逻辑电路结构——为IC设计的延时估计铺垫_基4布斯算法代码-程序员宅基地

文章浏览阅读1.1k次,点赞2次,收藏12次。常用组合逻辑电路结构——为IC设计的延时估计铺垫学习目的:估计模块间的delay,确保写的代码的timing 综合能给到多少HZ,以满足需求!_基4布斯算法代码

OpenAI Manager助手(基于SpringBoot和Vue)_chatgpt网页版-程序员宅基地

文章浏览阅读3.3k次,点赞3次,收藏5次。OpenAI Manager助手(基于SpringBoot和Vue)_chatgpt网页版

关于美国计算机奥赛USACO,你想知道的都在这_usaco可以多次提交吗-程序员宅基地

文章浏览阅读2.2k次。USACO自1992年举办,到目前为止已经举办了27届,目的是为了帮助美国信息学国家队选拔IOI的队员,目前逐渐发展为全球热门的线上赛事,成为美国大学申请条件下,含金量相当高的官方竞赛。USACO的比赛成绩可以助力计算机专业留学,越来越多的学生进入了康奈尔,麻省理工,普林斯顿,哈佛和耶鲁等大学,这些同学的共同点是他们都参加了美国计算机科学竞赛(USACO),并且取得过非常好的成绩。适合参赛人群USACO适合国内在读学生有意向申请美国大学的或者想锻炼自己编程能力的同学,高三学生也可以参加12月的第_usaco可以多次提交吗

MySQL存储过程和自定义函数_mysql自定义函数和存储过程-程序员宅基地

文章浏览阅读394次。1.1 存储程序1.2 创建存储过程1.3 创建自定义函数1.3.1 示例1.4 自定义函数和存储过程的区别1.5 变量的使用1.6 定义条件和处理程序1.6.1 定义条件1.6.1.1 示例1.6.2 定义处理程序1.6.2.1 示例1.7 光标的使用1.7.1 声明光标1.7.2 打开光标1.7.3 使用光标1.7.4 关闭光标1.8 流程控制的使用1.8.1 IF语句1.8.2 CASE语句1.8.3 LOOP语句1.8.4 LEAVE语句1.8.5 ITERATE语句1.8.6 REPEAT语句。_mysql自定义函数和存储过程

半导体基础知识与PN结_本征半导体电流为0-程序员宅基地

文章浏览阅读188次。半导体二极管——集成电路最小组成单元。_本征半导体电流为0

随便推点

【Unity3d Shader】水面和岩浆效果_unity 岩浆shader-程序员宅基地

文章浏览阅读2.8k次,点赞3次,收藏18次。游戏水面特效实现方式太多。咱们这边介绍的是一最简单的UV动画(无顶点位移),整个mesh由4个顶点构成。实现了水面效果(左图),不动代码稍微修改下参数和贴图可以实现岩浆效果(右图)。有要思路是1,uv按时间去做正弦波移动2,在1的基础上加个凹凸图混合uv3,在1、2的基础上加个水流方向4,加上对雾效的支持,如没必要请自行删除雾效代码(把包含fog的几行代码删除)S..._unity 岩浆shader

广义线性模型——Logistic回归模型(1)_广义线性回归模型-程序员宅基地

文章浏览阅读5k次。广义线性模型是线性模型的扩展,它通过连接函数建立响应变量的数学期望值与线性组合的预测变量之间的关系。广义线性模型拟合的形式为:其中g(μY)是条件均值的函数(称为连接函数)。另外,你可放松Y为正态分布的假设,改为Y 服从指数分布族中的一种分布即可。设定好连接函数和概率分布后,便可以通过最大似然估计的多次迭代推导出各参数值。在大部分情况下,线性模型就可以通过一系列连续型或类别型预测变量来预测正态分布的响应变量的工作。但是,有时候我们要进行非正态因变量的分析,例如:(1)类别型.._广义线性回归模型

HTML+CSS大作业 环境网页设计与实现(垃圾分类) web前端开发技术 web课程设计 网页规划与设计_垃圾分类网页设计目标怎么写-程序员宅基地

文章浏览阅读69次。环境保护、 保护地球、 校园环保、垃圾分类、绿色家园、等网站的设计与制作。 总结了一些学生网页制作的经验:一般的网页需要融入以下知识点:div+css布局、浮动、定位、高级css、表格、表单及验证、js轮播图、音频 视频 Flash的应用、ul li、下拉导航栏、鼠标划过效果等知识点,网页的风格主题也很全面:如爱好、风景、校园、美食、动漫、游戏、咖啡、音乐、家乡、电影、名人、商城以及个人主页等主题,学生、新手可参考下方页面的布局和设计和HTML源码(有用点赞△) 一套A+的网_垃圾分类网页设计目标怎么写

C# .Net 发布后,把dll全部放在一个文件夹中,让软件目录更整洁_.net dll 全局目录-程序员宅基地

文章浏览阅读614次,点赞7次,收藏11次。之前找到一个修改 exe 中 DLL地址 的方法, 不太好使,虽然能正确启动, 但无法改变 exe 的工作目录,这就影响了.Net 中很多获取 exe 执行目录来拼接的地址 ( 相对路径 ),比如 wwwroot 和 代码中相对目录还有一些复制到目录的普通文件 等等,它们的地址都会指向原来 exe 的目录, 而不是自定义的 “lib” 目录,根本原因就是没有修改 exe 的工作目录这次来搞一个启动程序,把 .net 的所有东西都放在一个文件夹,在文件夹同级的目录制作一个 exe._.net dll 全局目录

BRIEF特征点描述算法_breif description calculation 特征点-程序员宅基地

文章浏览阅读1.5k次。本文为转载,原博客地址:http://blog.csdn.net/hujingshuang/article/details/46910259简介 BRIEF是2010年的一篇名为《BRIEF:Binary Robust Independent Elementary Features》的文章中提出,BRIEF是对已检测到的特征点进行描述,它是一种二进制编码的描述子,摈弃了利用区域灰度..._breif description calculation 特征点

房屋租赁管理系统的设计和实现,SpringBoot计算机毕业设计论文_基于spring boot的房屋租赁系统论文-程序员宅基地

文章浏览阅读4.1k次,点赞21次,收藏79次。本文是《基于SpringBoot的房屋租赁管理系统》的配套原创说明文档,可以给应届毕业生提供格式撰写参考,也可以给开发类似系统的朋友们提供功能业务设计思路。_基于spring boot的房屋租赁系统论文