好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

Android平台输入法开发解析.docx

8页
  • 卖家[上传人]:野鹰
  • 文档编号:14634083
  • 上传时间:2017-11-01
  • 文档格式:DOCX
  • 文档大小:65.57KB
  • / 8 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • Android 平台输入法开发解析Android 平台自 1.5 版本之后开放了输入法框架( Input Method Framework,IMF) ,IMF是 Android 平台的特色设计它的出现,为诞生不带实体键盘的设备提供了可能同时,IMF 开放了 Android 平台输入法的开发接口,为 Android 平台的输入法提供了可扩展性本文首先介绍 Android 平台 IMF 的构成、工作机制和流程,以便广大开发者能够更好的理解 Android 平台是如何实现文字输入接下来,将以一个简单的例子,介绍如何进行简单的输入法开发,开发者应该可以对 Android 平台的输入法开发形成一个初步的认识1. Android 平台 IMF 简介Android 平台的 IMF 按照功能分为三个主要模块,分别为:客户端控件,输入法服务(IMMS) ,以及输入法应用(IME) 如果要深刻的理解和掌握 Android 平台的输入法开发技巧,那么必须要了解 Android 平台 IMF 内部各个模块之间的工作机制客户端控件,是指具有文字编辑功能的系统控件(如 EditText) ,是平台内部输入法应用人机交互的起点。

      输入法服务,是 Android 平台的底层基础服务之一,负责管理输入法,包括输入法的安装、注册、激活等输入法应用,则是指平台内预置,或者后续安装的输入法程序三个模块间的交互关系如下:IInputMethodManager InputMethodSessionInputMethod输入法应用客户端控件输入法服务InputMethodManagerInputMethodConnection输入法框架(IMF下面我们将分别介绍以上三个模块,并简要介绍各模块内主要使用的对象和服务1.1 客户端控件Android 平台的客户端控件主要是 TextView 及其子类客户端控件是输入法人机交互的起点客户端控件与输入法服务和输入法应用都有交互操作以 EditText 为例,当客户端控件接受到焦点时,控件启动输入法应用并显示键盘;而失去焦点时,则隐藏键盘另外,EditText 控件收到长按事件时,弹出输入法选择菜单这类操作属于客户端控件与输入法服务间的交互此外,客户端控件还可以向输入法应用传递文本状态,包括光标位置、文本选择等;接受并显示输入法应用反馈的输入文字这类交互属于客户端控件与输入法应用的交互客户端控件对输入法服务和输入法应用的操作,都是通过对 InputMethodManager 实例的调用来实现的。

      InputMethodManager 更像是一个供客户端控件使用 API 操作的集合,定义对输入法应用以及输入法服务的一系列操作客户端控件会通过InputMethodManager.peekInstance() 来获取唯一的实例需要指出的是,各调用函数的具体操作并不是在 InputMethodManager 中具体实现的Android 平台的输入法框架定义了 IIputMethodManager 接口和 IIputMethodSession 接口分别定义了对输入法服务和输入法应用的操作而 InputMethodManagerService 和InputMethodService 则分别对这两个接口进行了具体的实现这样通过 AIDL 机制,客户端控件便可以跨进程的调用其他 service 内的实现通过这样的机制,Android 平台降低了输入法框架内各个模块间的耦合性,并且保证了输入法应用的可扩展性客户端无需知道使用的是那一款输入法,从而实现了简单直接的控制另外还需要指出的,客户端控件通过 IIputMethodSession 对于输入法应用的交互是单向的,即只能向输入法应用传递信息,无法获取信息。

      客户端应用从输入法应用获取信息是通过 InputConnection 来实现的, 在启动输入法时,InputConnection 由客户端控件创建,并传递给输入法应用,由输入法应用调用,进行信息反馈1.2 输入法服务输入法服务作为平台底层的一项基础服务,用来管理输入法应用输入法服务的主要工作由 InputMethdoManagerService(IMMS )完成下面简要的介绍输入法服务如何实现输入法的安装、切换 输入法安装IMMS 内部包含一个 receiver,注册接收所有程序包安装、卸载的消息当收到此类消息后,IMMS 会通过系统的 PackageManager 查询所有声明为 InputMethod 的程序,并生成一个系统可用的输入法列表,供用户选择使用 输入法切换当用户选择了一款输入法后,IMMS 将此输入法的 ID 保存为系统的默认输入法 ID这里的 ID 是该输入法在 IMMS 内维护的可用输入法列表中的位置 ID当客户端通过 InputMethodManager 启动输入法应用时, IMMS 将根据这个 ID 从输入法列表中取出输入法,并加载使用1.3 输入法应用输入法应用是具体处理用户输入行为的应用程序。

      为了能够在 Android 的输入法框架中良好的运行,所有的输入法应用都需要继承特定的 serviceAndroid 平台的输入法框架为输入法应用定义了一个基类 InputMethodServiceInputMethodService 提供了一个输入法的标准实现定义了输入法生命周期内的重要函数,提供给开发人员进行相应的处理为了帮助开发者了解输入法应用的工作流程我们首先看一下输入法应用的生命周期: 当用户触发输入法显示的时候(客户端控件获得焦点) ,InputMethodService 启动首先调用 onCreate() 函数,该函数在输入法第一次启动的时候调用,适合用来做一些初始化的设置,与其他 service 相同; 调用 onCreateInputView() 函数,在该函数中创建 KeyboardView 并返回; 调用 onCreateCandidatesView()函数,在该函数中创建候选区实现并返回; 调用 onStartInputView()函数来开始输入内容, 输入结束后调用 onFinishInput()函数来结束当前的输入, 如果移动到下一个输入框则重复调用 onStartInputView 和 onFinishInput 函数; 在输入法关闭的时候调用 onDestroy() 函数。

      结束开 始o n C r e a t e ( )o n C r e a t e I n p u t V ie w ( )o n C r e a t e C a n d id a t e V ie w ( )o n S t a r t I n p u t V ie w ( )文本输入o n F in is h I n p u t ( )o n D e s t r o y ( )o n D e s t r o y ( )InputMethodService 实现了两个重要的接口, InputMethod 和 InputMethodSession InputMethodInputMethod 接口定义了一套操纵输入法应用的方法如,bindInput, hideInput, startInput 等为了系统安全,这类接口只有系统可以访问,客户端控件无法直接调用这个接口所有的输入法应用都需要客户端控件具有 BIND_INPUT_METHOD 权限,作为系统的安全机制,否则将无法与输入法服务交互 InputMethodSessionInputMethodSession 作为 InputMethod 的辅助接口类,为客户端控件开放了可直接调用的函数接口。

      包括向输入法应用分发键盘事件,更新光标位置,更新编辑区域内选择的问题信息等2. Android 平台输入法开发方法通过对 Android 平台输入法框架的介绍,相信大家已经初步了解了 Android 平台内输入法相关模块间的交互和工作机制Android 平台内的输入法开发主要包括上层界面 UI 的开发,以及底层输入法引擎的开发本文所介绍的开发技术包括如何在 Android 平台下如何构建输入法应用,如何设计键盘,进行界面开发值得说明的是,输入法的很多核心功能都是体现在底层输入法引擎中的输入法引擎的功能包括根据输入字符获取候选词以及联想词,调整管理词库词频等等简而言之,输入法引擎是一个语言邻域专用的数据库引擎,根据用户按键输入,在语言数据库中查询出候选,供用户选择这些与 Android 平台的开发是相互独立的,在此不做细致的说明下面我们以简单的实例,说明如何开发一个 Android 平台的输入法应用2.1.配置服务输入法应用在 Android 系统中是一个 service与其他 service 一样,输入法需要通过在AndroidManifest.xml 中进行 service 定义示例如下:该 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 时,什么也不显示当输入区域显示后,可以通过实现 onEvaluateInputViewShown()来控制如果想替换显示的输入区域可以通过 setInputView(View)实现生成输入区域的 View 通过 LayoutInflater 加载 Layout 中的资源文件来实现在资源文件中或者是一个 KeyboardView 或者是由若干个 KeyboardView 组成的 Container通常在这个函数中都需要注册键盘事件的监听器 setOnKeyboardActionListener这个监听器用来处理以下键盘事件:onKey(int primaryCode, int[] keyCodes)onPress(int primaryCode)onRelease(int primaryCode)onText(CharSequence text)2.2.2 onCreateCandidatesView该函数在联想词条第一次被显示的时候调用,仅调用一次。

      显示的 View 通过 return返回如果没有联想条,则返回 null控制是否显示联想词条,可以通过 setCandidatesViewShown(boolean)来实现如果想替换联想词条则通过实现 setCandidatesView(View).来实。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.