没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
android 平台开发指南
Email: joyfly2006@yahoo.com.cn
QQ: 448086006
1 输入法框架介绍
1.1 输入法框图
输 入 法 框架按照 功 能 分 为 三 个 主 要 模 块 , 分 别 为 : 客 户 端 控 件 , 输 入 法 服 务
(IMMS),以及输入法应用(IME)。如果要深刻的理解和掌握 Android 平台的输入
法开发技巧,那么必须要了解 Android 平台 IMF 内部各个模块之间的工作机制。
客户端控件,是指具有文字编辑功能的系统控件(如 EditText),是平台内部输入法
应用人机交互的起点。输入法服务,是 Android 平台的底层基础服务之一,负责管理输入
法,包括输入法的安装、注册、激活等。输入法应用,则是指平台内预置,或者后续安装
的输入法程序。三个模块间的交互关系如下:
Android 的输入法框架比较复杂。从进程的角度来讲,相关功能主要分布在下面三个
位置:
输入法模块提供软键盘,将用户在软键盘上的按键输入根据某种算法(如 Zi, T9,
国笔等)转换成单词,然后传递给客户端应用。目录 development/samples/SoftKeyb
oard 下提供了一个输入法模块实例。如果想要实现一个中文输入法,可参考这个实例。
下面我们将分别介绍以上三个模块,并简要介绍各模块内主要使用的对象和服务。
1.1.1 客户端控件
Android 平台的客户端控件主要是 TextView 及其子类。客户端控件是输入法人机交
互的起点。客户端控件与输入法服务和输入法应用都有交互操作。以 EditText 为例,当
客户端控件接受到焦点时,控件启动输入法应用并显示键盘;而失去焦点时,则隐藏键盘。
另外,EditText 控件收到长按事件时,弹出输入法选择菜单。这类操作属于客户端控件与
输入法服务间的交互。此外,客户端控件还可以向输入法应用传递文本状态,包括光标位
置、文本选择等;接受并显示输入法应用反馈的输入文字。这类交互属于客户端控件与输
入法应用的交互。客户端控件对输入法服务和输入法应用的操作,都是通过对
InputMethodManager 实例的调用来实现的。InputMethodManager 更像是一个供
客户端控件使用 API 操作的集合,定义对输入法应用以及输入法服务的一系列操作。
客户端控件会通过àInputMethodManager.peekInstance() 来获取唯一的实例。
需要指出的是,各调用函数的具体操作并不是在 InputMethodManager 中具体实现的。
Android 平台的输入法框架定义了 IIputMethodManager 接口和
IIputMethodSession 接口分别定义了对输入法服务和输入法应用的操作。
InputMethodManagerService 和 InputMethodService 则分别对这两个接口进行了
具体的实现。这样通过 AIDL 机制,客户端控件便可以跨进程的调用其他 service 内的实
现。通过这样的机制,Android 平台降低了输入法框架内各个模块间的耦合性,并且保证
了输入法应用的可扩展性。客户端无需知道使用的是那一款输入法,从而实现了简单直接
的控制。另外还需要指出的,客户端控件通过 IIputMethodSession 对于输入法应用
的交互是单向的,即只能向输入法应用传递信息,无法获取信息。InputMethodSession
作为 InputMethod 的辅助接口类,为客户端控件开放了可直接调用的函数接口。包括向
输入法应用分发键盘事件,更新光标位置,更新编辑区域内选择的问题信息等。客户端控
件通过àIIputMethodSession 对于输入法应用的交互是单向的,即只能向输入法应用传
递信息,无法获取信息。
客户端应用从输入法应用获取信息是通过 InputConnection 来实现的, 在启动输入法
时,InputConnection 由客户端控件创建,并传递给输入法应用,由输入法应用调用,
进行信息反馈。
1.1.2 输入法服务
输入法服务作为平台底层的一项基础服务,用来管理输入法应用。输入法服务的主要
工作由 InputMethdoManagerService(IMMS)完成。下面简要的介绍输入法服务如
何实现输入法的安装、切换。
输入法安装
IMMS 内部包含一个 receiver,注册接收所有程序包安装、卸载的消息。当收到此
类消息后,IMMS 会通过系统的 PackageManager 查询所有声明为 InputMethod 的程
序,并生成一个系统可用的输入法列表,供用户选择使用。
附加,android 应用程序可以通过监听安装和卸载应用程序广播消息,分别为:
android.intent.action.PACKAGE_ADDED
android.intent.action.PACKAGE_REMOVED
并且在
androidManifest.xml
中添加访问权限:
<uses-permission android:name="android.permission.RESTART_PACKAGES"/>
输入法切换
当用户选择了一款输入法后,IMMS 将此输入法的 ID 保存为系统的默认输入法 ID。
这里的 ID 是该输入法在 IMMS 内维护的可用输入法列表中的位置 ID。
当客户端通过 InputMethodManager 启动输入法应用时,IMMS 将根据这个 ID 从输入
法列表中取出输入法,并加载使用。
1.1.3 输入法应用
输入法应用是具体处理用户输入行为的应用程序。为了能够在 Android 的输入法框架
中良好的运行,所有的输入法应用都需要继承特定的 service。Android 平台的输入法框
架为输入法应用定义了一个基类 InputMethodService。InputMethodService 提供了
一个输入法的标准实现。定义了输入法生命周期内的重要函数,提供给开发人员进行相应
的处理。
为了帮助开发者了解输入法应用的工作流程。我们首先看一下输入法应用的生命周期:
当用户触发输入法显示的时候(客户端控件获得焦点),InputMethodService
启动。首先调用 onCreate() 函数,该函数在输入法第一次启动的时候调用,适
合用来做一些初始化的设置,与其他 service 相同;
调用 onCreateInputView() 函数,在该函数中创建 KeyboardView 并返回;
调用 onCreateCandidatesView()函数,在该函数中创建候选区实现并返回;
调用 onStartInputView()函数来开始输入内容,
输入结束后调用 onFinishInput()函数来结束当前的输入,
如果移动到下一个输入框则重复调用 onStartInputView 和 onFinishInput 函
数;
在输入法关闭的时候调用 onDestroy() 函数。
InputMethodService 实现了两个重要的接口,InputMethod 和
InputMethodSession。
InputMethod
InputMethod 接口定义了一套操纵输入法应用的方法。如,bindInput, hideInput,
startInput 等。为了系统安全,这类接口只有系统可以访问,客户端控件无法直接调用这
个接口。所有的输入法应用都需要客户端控件具有 BIND_INPUT_METHOD 权限,作
为系统的安全机制,否则将无法与输入法服务交互。à
在 InputMethod.java 中定义,在 InputMethodService.java 中,通过接口
onCreateInputMethodInterface 来创建了一个 InputMethod 实例,其实例类型为
InputMethodImpl,该类是从 AbstractInputMethodImpl 派生的,主要用于衔接客户
端控件和输入法应用交互的接口。
InputMethodSession
InputMethodSession 作为 InputMethod 的辅助接口类,为客户端控件开放了可
直接调用的函数接口。包括向输入法应用分发键盘事件,更新光标位置,更新编辑区域内
选择的问题信息等。在 InputMethodSession.java 中定义。
在 InputMethodSession.java 中定义,在 InputMethodService.java 中,通过接
口 onCreateInputMethodSessionInterface 来创建了一个 InputMethodSession 实
例,其实例类型为 InputMethodSessionImpl,该类是从
剩余19页未读,继续阅读
资源评论
- liupeng20112013-09-15通俗易懂,精辟入里。
- 刘栋文2016-05-05非常好的资源, 楼主努力, 32个赞
- gymsun2014-03-17开发输入法不错的入门教程
- anshuiyin2018-10-29楼主厉害,费心了
joyfly2008
- 粉丝: 1
- 资源: 6
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功