免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3536 | 回复: 0
打印 上一主题 下一主题

[转]Android IMF学习笔记 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-11-11 11:23 |只看该作者 |倒序浏览

                 IMF是input method framework的简称, 它是Android 1.5新添加进去的一个重要功能,用来支持软键盘、各种的输入法。 到目前位置(2009-04-03),Android 1.5还没有正式发布,但IMF的功能已经很稳定,其上已经存在有3种输入法。分别是LatinIME(软键盘)、 OpenWnn(CJK输入法)、PinyinIME(GOOGLE 拼音),还缺少中文的手写、五笔。  虽说按照已有的输入法模块, 也能写出自己想要的输入法。但是弄懂底层一些的东西,对于写新的输入法还是有帮助的。我学习的目的就是这样。下面开始:相关代码的位置:frameworks/base/core/java/com/android/internal/view/IMF接口定义frameworks/base/core/java/android/view/inputmothod/IMF客户端frameworks/base/core/java/android/inputmethodservice/IMF服务端frameworks/base/services/java/com/android/server/InputMethodManagerService.java输入法管理服务packages/inputmethods/现有的输入法development/samples/SoftKeyboard/软键盘示例frameworks/base/core/java/android/view/View.javaframeworks/base/core/java/android/widget/TextView.java控件和输入法的交互按照SDK文档的叙述,IMF包含3个主要部分:1、input method manager (IMM)相当于客户端的API,协调其它部分的互动,负责跟系统服务(IMMS) 通讯。2、input method (IME)界面和输入法引擎, 处理用户的输入。3、client applications传递一些信息, IMM用来决定焦点和IME状态, IME一次只能有一个Client连接。InputMethodManager实例化的时候, 会连接到IMMS服务,然后一些调用里会请求IMMS的服务。InputMethodManagerService处理来自InputMethodManager的请求,管理输入法服务。初始化的时候,会做如下一些事情:1、注册一些系统事件,处理事件(开关屏、关闭系统对话框、包改变)跟输入法的交互, 例如: 关屏时会把输入法菜单关闭;输入法包被删除时,将输入法从可用列表移除等。2、加载输入法列表(buildInputMethodListLocked),读取启用的输入法,如果设置为空,加载全部输入法,并选择一个默认输入法。3、加载状态栏图标、加载DB服务端。View和输入法的交互onFocusChanged()失去焦点调用用imm.focusOut(), 得到焦点调用imm.focusIn()onWindowFocusChanged失去焦点调用用imm.focusOut(), 得到焦点调用imm.focusIn()TextView和输入法的交互setInputType()改变输入法类型后, 会重启输入法imm.restartInput()onEditorAction()收到输入完成事件,隐藏输入法界面imm.hideSoftInputFromWindow()onDraw()输入框内容改变,更新输入法的内容imm.updateExtractedText输入框文本被选择, 更新输入法的选择信息imm.updateSelection输入框的光标位置改变, 更新输入法的光标位置imm.updateCursorps. imm.isWatchingCursoronKeyUp()收到KEYCODE_DPAD_CENTER按键事件, 显示输入法界面imm.showSoftInput,这个事件鼠标左键点击,都是输入框获取焦点。收到KeyEvent.KEYCODE_ENTER按键事件,状态是输入完成,关闭输入法界面imm.hideSoftInputFromWindow()onTouchEvent()触屏事件, 输入框获取焦点, 显示输入法界面imm.showSoftInputisInputMethodTarget()调用imm.isActive(), 用来判断此控件是否启用输入法onTextContextMenuItem()如果用户选择了“切换输入法”(ID_SWITCH_INPUT_METHOD),显示输入法菜单imm.showInputMethodPickersetKeyListener()每次调用都重启输入法imm.restartInput()setText()输入框内容改变, 重启输入法imm.restartInput()
画出IMF略图, 比较容易理解个大概。
下一步:
1、Widget和IME之间的交互、数据流向
2、各个部分的具体分析
###################################################################
InputConnection
代码:
接口定义 frameworks/base/core/java/android/view/inputmethod/InputConnection.java
基础实现 frameworks/base/core/java/android/view/inputmethod/BaseInputConnection.java
控件和输入法之间的数据交换通过InputConnection,InputConnection由输入控件的onCreateInputConnection创建。
通过这个InputConnection将输入法服务和控件帮定,建立连接, 输入法服务和控件的数据、事件交互都通过这个连接。
输入内容是通过事件来提交的, 在sendCurrentText函数里创建一个特殊设备KeyCharacterMap.BUILT_IN_KEYBOARD
的按键事件,然后发送ViewRoot.DISPATCH_KEY_FROM_IME消息给输入框的父窗体。
在ViewRoot(frameworks/base/core/java/android/view/ViewRoot.java )的handleMessage事件回调里会处理这个
事件,通过deliverKeyEventToViewHierarchy()再分发这个事件。
在deliverKeyEventToViewHierarchy()中会调用view.dispatchKeyEvent分发这个事件。
最终这个事件会被具体控件的按键回调函数处理,例如TextView是在doKeyDown里接收输入的字符。
输入法向应用发送按键也是类似的。#########################################################################
       
               
                       
                               
                               
                               
                                       
                                       
                                        InputMethodService
frameworks/base/core/java/android/inputmethodservice/InputMethodService.java
InputMethodService是一个输入法基类, 基类实现了大部分的基本接口。
一般输入法都需要从这个类里派生,然后根据需求来实现自己的接口, 就可以编写一个自己的输
入法。
例如要实现一个五笔输入法, 从这个类里继承, 然后重新实现一个五笔键盘和候选字的界面和产
生结果的接口。
代码文件里有很多的说明, SDK文档里也有。
               
               
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/85193/showart_2091425.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP