android输入法02:openwnn源码解析01—输入流程
16lz
2021-12-04
之后要开始android日文输入法的测试,因此现在开始研究android输入法。之前两篇文章已经对android自带的输入法实例softkeyboard的源码进行了解析。这一系列将开始学openwnn的源码。
openwnn是一家日本公司开发的开源输入法框架,涉及中文、日文、韩文。目前已经加入到了android源码之中。因此你打开一个模拟器时,会发现其中有一个japanese ime的输入法,其服务名为openwnn,这个就是openwnn的日文输入法。
1、日文输入
本文章主要以日文输入法为主。为了方便大家阅读,先对日文输入法做一个简单的介绍:
- 日文输入法分为罗马音输入法(类似中文拼音)和假名输入法(类似中文五笔)。比如,你要输入”可愛“,则用罗马音输入,需要输入”kawai“,然后在候选词中选择”可愛“;若使用假名输入,则需要输入”かわい“,在候选中选择”可愛“。
- 日文由平假名、片假名(分全角片假名和半角片甲名)和汉字组成。通常学日语的人会说到50音图,就是日语50个平假名(与之对应有50个片假名)的读音。其中平假名是由汉字演化而来的,类似于日文的拼音,比如”可愛“的日文读音就是”かわい“。片假名是由于外来语的入侵,原来平假名无法表达所有的外文内容而设计的。
2、输入流程 2.1 android输入法输入流程 现在我们开始介绍输入流程。从前面的文章对softkeyboard的分析(若你对输入法不了解,请看前两篇介绍softkeyboard的文章,否则后面的内容很难看懂),我们可以知道,输入法包括四个部分:Keyboard,KeyboardView,CandidateView,InputMethodService。其中InputMethodService是前面三者的使用者,同时也设定了输入流程。android输入法的调用流程如下:
输入法在Android中的本质就是一个Service,假设用户刚刚启动Android,用户移动焦点首次进入文本编辑框时,Android便会通知Service开始进行初始化工作。于是便有了如图中的一系列动作。
追根溯源,onCreate方法继承至Service类,其意义和其他Service的是一样的。Sample在这里,做了一些非UI方面的初始化,即字符串变量词汇分隔符的初始化。
接下来执行onInitializeInterface,这里是进行UI初始化的地方,创建以后和配置修改以后,都会调用这个方法。Sample在这里对Keyboard进行了初始化,从XML文件中读取软键盘信息,封装进Keyboard对象。
第三个执行的就是onStartInput方法,在这里,我们被绑定到了客户端,接收所有关于编辑对象的详细信息。
第四个执行的方法是onCreateInputView,在用户输入的区域要显示时,这个方法由框架调用,输入法首次显示时,或者配置信息改变时,该方法就会被执行。在该方法中,对inputview进行初始化:读取布局文件信息,设置onKeyboardActionListener,并初始设置 keyboard。
第五个方法是onCreateCandidatesView,在要显示候选词汇的视图时,由框架调用。和onCreateInputView类似。在这个方式中,对candidateview 进行初始化。
第六个方法,也是最后一个方法,即onStartInputView,正是在这个方法中,将inputview和当前keyboard重新关联起来。
在上面的六个方法中,onCreateInputView和onCreateCandidatesView两个方法只有在初始化时才会执行一次,除非有配置信息发生改变。那么究竟什么是配置信息发生改变呢?在看InputMethodService的API文档时,可以看到有一个方法onConfigurationChanged,根据文档解释,这个方法主要负责配置更改的情况。
2.2 相关类分析 openwnn中对上面这些流程的控制来自于两个类OpenWnn.java和OpenWnnJAJP.java,其中前者是通用接口,后者是对日文输入法的定制版。我们看一下第一个类OpenWnn.java。
其中的变量包括如下部分: [java] view plain copy
- /**Candidateview*/
- protectedCandidatesViewManagermCandidatesViewManager=null;
- /**Inputview(softwarekeyboard)*/
- protectedInputViewManagermInputViewManager=null;
- /**Conversionengine*/
- protectedWnnEnginemConverter=null;
- /**Pre-converter(forRomaji-to-Kanainput,Hangulinput,etc.)*/
- protectedLetterConvertermPreConverter=null;
- /**Theinputing/editingstring*/
- protectedComposingTextmComposingText=null;
- /**Theinputconnection*/
- protectedInputConnectionmInputConnection=null;
- /**Autohidecandidateview*/
- protectedbooleanmAutoHideMode=true;
- /**Directinputmode*/
- protectedbooleanmDirectInputMode=true;
- /**FlagforcheckingifthepreviousdownkeyeventisconsumedbyOpenWnn*/
- privatebooleanmConsumeDownEvent;
从这些方法中我们可以看到,这些方法主要也是应用输入法的处理流程中。有需要的同学可以按照第一张输入法流程图对应的类来看看相关的函数代码,就可以对其输入法流程有比较深刻的认识。
更多相关文章
- 浅谈Java中Collections.sort对List排序的两种方法
- Python list sort方法的具体使用
- python list.sort()根据多个关键字排序的方法实现
- Android实现滑动的7种方法
- Android(安卓)View(一)-View坐标以及方法说明
- android window类的解释及软输入法模式选项:
- android Webview 上传图片兼容各android版本
- android 开发屏蔽home键,返回键
- cocos2dx 使用jni方法获取android mac地址