Android PinyinIME 源码笔记 -- 附A.1 输入法的启动

google 输入法源码debug环境搭建 <br />首先看一下http://www.cnblogs.com/zhangweia/archive/2010/08/19/1803434.html 是调试android源码的基本过程,但是如果是想调试输入法时出现了一个错误:<br />在eclipse的Debug环境下调试普通java程序时还未到我的断点(断点是打在onStartInputView,onCreateInputView<br /> 等)就会出现Source not found.和一个Edit Source Lookup Path... 阅读详情

转自:http://blog.sina.com.cn/funyoung

在Android官方Blog介绍了Android平台输入法的生命周期,如下图


当一个可编辑的文本框获得焦点时,系统就会启动当前输入法,首先调用当前输入法的onCreate()函数。

Android系统的输入法通常都派生自基类 android.inputmethodservice.InputMethodService,基类 InputMethodService定义了Android输入法的公共API集合,其中onCreate就是其中的一个API函数。各个具体的输入法实现根据需要重载实现这些API的全部或者一部分。

Android SDK提供了一个最简单的输入法示例, SoftKeyboard ,这个示例可以在SDK安装目录下samples/plaform-X下找到(其中X为SDK的API level数,如cupcake为3,donut为4,froyo为8)。 SoftKeyboard 的onCreate()函数代码如下:
       @Override public void onCreate() {
             super.onCreate();
             mWordSeparators = getResources().getString(R.string.word_separators);
       }
除了简单调用父类的同名函数外,从资源文件中读出单词分隔符的串并保存在成员变量里。每个输入法在被创建时要进行的初始化不尽相同。如Android源代码树在packags/inputmethods子目录下还有其它具体的输入法实例。(参考文档 http://android.git.kernel.org/?p=platform/packages/inputmethods/LatinIME.git;a=tree)可以把Android源码取到本地计算机,还可以在线浏览另一个输入法实例LatinIME的onCreate()函数,它要做的工作就复杂得多:创建键盘,读取系统信息,注册系统铃声变化的监听器等等。

回来PinyinIME(也在Android源码的packags/inputmethods下)的onCreate()函数,省略掉与LatinIME类似的代码。
       @Override
       public void onCreate() {
             ...
             startPinyinDecoderServic e();
             ...
       }
函数startPinyinDecoderServic e()检测PinyinDecoderService服务如果未运行,则通过系统函数bindService()来启动它。bindService的第2个参数对象有2个成员函数会在PinyinDecoderService服务启动过程中被调用:
onServiceConnected()      -- PinyinDecoderService建立,PinyinDecoderService.onBind()返回的binder对象作为函数的第2个参数传入。
onServiceDisconnected() --  PinyinDecoderService结束。

关于bindService()的第2个参数以及其在进程间调用的作用可参见 http://developer.android.com/guide/developing/tools/aidl.html,在PinyinIME中,它是ServiceConnection接口的一个实现,onServiceDisconnected()什么都不用做,onServiceConnected()在PinyinDecoderService建立时被调用,远程service进程的binder对象作为函数的第2个参数传入。输入法作为客户端进程,需要借助以下辅助函数把传入的binder对象转化成可用的接口:
IPinyinDecoderService.Stub.asInterface()
PinyinIME输入法把转化后的接口对象保存在类DecodingInfo对象mDecInfo的mIPinyinDecoderService成员,以供其后的调用:
       public class PinyinDecoderServiceConn ection implements ServiceConnection {
             public void onServiceConnected(ComponentName name, IBinder service) {
                   mDecInfo.mIPinyinDecoderService = IPinyinDecoderService.Stub
                               .asInterface(service);
             }
             ....
       }

mDecInfo.mIPinyinDecoderService的声明如下:
       public class DecodingInfo {
             ......
            
             private IPinyinDecoderService mIPinyinDecoderService;
             ......
       }

现在再来看在输入法(客户端进程)调用bindService时,服务端进程启动的详细过程:
因为第1个参数Intent对象的类名在调用前被设成PinyinDecoderService.class,所以系统进程响应bindService时,如果服务未运行时首先调用PinyinDecoderService的onCreate()
       @Override
       public void onCreate() {
             super.onCreate();
             mUsr_dict_file = getFileStreamPath("usr_dict.dat").getPath();
             ......
             initPinyinEngine();
       }
接下来调用PinyinDecoderService的onBind()函数,并把返回的binder对象传给前面说过的ServiceConnection.onServiceConnected():
       @Override
       public IBinder onBind(Intent intent) {
             return mBinder;
       }

辅助的初始化函数initPinyinEngine()首先打算系统静态字典资源文件res/raw/dict_pinyin.dat,然后把用户字典名写到一个byte数组里,最后把静态字典文件信息与用户字典名作为参数,调用本地c/c++函数nativeImOpenDecoderFd()。

onBind函数返回的binder对象,就是
private final IPinyinDecoderService.Stub mBinder = new IPinyinDecoderService.Stub() {
       ....
};
android 启动输入法,Android PinyinIME----输入法的启动 当一个可编辑的文本框获得焦点时,系统就会启动当前输入法,首先调用当前输入法的onCreate()函数。Android系统的输入法通常都派生自基类android.inputmethodservice.InputMethodService,基类InputMethodService定义了Android输入法的公共API集合,其中onCreate就是其中的一个API函数。各个具体的输入法实现根据需要重载实... 阅读详情

相关推荐

Android 7.1.2 更换原生输入法

Android 7.1.2 更换原生输入法

qq_20395637的博客 1353

android OpenWnnIM 开源输入法

安卓(Android)系统本身的确没有原生的日文输入法,但是谷歌公司在安卓SDK中包含了日本omronsoft软件公司的开源输入法OpenWnn。OpenWnn是omronsoft公司的手机输入法iWnn IME的精简开源版本。OpenWnn在官方各个版本的安卓SDK当中一直都存在,一部分面向日本市场的厂商将其作为预装输入法。同时,还出现了一些基于OpenWnn的衍生输入法项目,例如OpenWnn Plus等,不过影响力很有限。

Android输入法开发实战:谷歌拼音输入法PinyinIME源码解析

Android输入法作为系统级应用,是用户与设备交互的核心入口之一。其核心组件为,它不仅负责输入界面的展示与交互,还需与系统服务(如)进行绑定与通信。输入法的生命周期管理至关重要,涉及启动、绑定、切换及销毁等多个状态节点。同时,输入事件(如按键、滑动)在系统与输入法之间的流转机制,构成了输入行为的基础逻辑。本章将从整体架构入手,解析输入法与系统的通信机制,为后续深入理解PinyinIME的实现打下坚实基础。Android设备屏幕尺寸和分辨率差异较大,PinyinIME需适配不同机型。

weixin_42351520的博客 1168

qt平台集成google拼音中文输入法

qt自5.7.0版本后自带了qtvirtualkeyboard模块,在示例程序里面用过输入法demo,确实很赞,支持各国语言的输入法,中文输入法集成的google智能拼音,支持模糊拼音输入。很遗憾的是它只能在基于QML的应用平台上使用,在传统的Qt widgets应用上无法使用。 在Qt安装目录下qtvirtualkeyboard模块里面,可以找到google拼音源码,通过它来实现基于googl...

清心永恒的博客 6624

带注释的PinyinIME源码包:Android输入法开发的核心指南

输入法作为移动端高频交互组件,其底层实现涉及系统服务绑定、事件分发、文本解码与视图渲染等多层技术。理解输入法框架的关键在于掌握IME(Input Method Editor)的生命周期与调用链,而AOSP中的PinyinIME项目正是这一领域的经典样本。它完整实现了从按键事件到候选词上屏的闭环,通过阅读其源码,开发者可以清晰看到InputMethodService如何驱动软键盘显示、JNI层如何完成拼音切分与词频排序、以及候选视图如何高效绘制。这种知识不仅能用于系统级输入法开发,对定制企业键盘、优化文本录入

weixin_29165725的博客 158

Android输入法开发进阶:PinyinIME源码核心机制与实现解析

输入法是移动端高频交互的基础组件,其候选排序、多音字切分和用户词同步等能力,通常由系统级服务与解码引擎协同完成。在Android体系中,输入法以InputMethodService为宿主,通过AIDL跨进程通信调用解码服务,并由SkbContainer与CandidateView承载软键盘和候选栏的绘制与交互。拼音解码引擎则依赖音节切分、词频统计与语言模型,在lattice结构上计算最优路径,从而保证候选结果的准确性和响应速度。词库管理采用只读主词库、用户动态词库与会话临时词库的分层设计,通过Content

weixin_29183637的博客 100

快速搭建一款输入法(封装输入法引擎)

输入法最核心的是输入法引擎,输入法引擎负责加载和管理输入法配置和输入法的词库,输入法引擎对用户输入的拼音字符串进行处理并返回对应的候选列表。通过引入输入法引擎我们就可以将我们输入法的拼音串转换成对应的中文候选了。 这里我不建议用户自己开发输入法引擎,这个难度还是很大的,涉及到了音节拆分和智能组词等等。如果是简单的使用的话,采用开源的输入法引擎库就行,这里我采用的是谷歌的开源输入法引擎,引擎项目的地址如下: GitHub - lelelongwang/GooglePinyinIME: Google 拼音输

yang1fei2的博客 4207

pinyin_dict.zip

JS拼音转汉字的包,非常实用 1. 体积足够小,适合web环境,常见汉字字典文件仅26kb,完整汉字也只有122kb,应该说是互联网上最小的; 2. 支持多种输出格式,如带声调、不带声调、拼音首字母; 3. 支持多音字:如果不引入词库文件,会将所有结果枚举出来,如果引入词库,则可以识别多音字(当然识别的准确度有待持续完善),由于词库较大,一般不推荐web环境使用; 4. 附带一个简单的JS版拼音输入法;

Android PinyinIME 源码笔记 -- 2. 底层服务启动

PinyinIME输入法启动过程介绍见“附A.1 输入法的启动”http://blog.sina.com.cn/s/blog_4177a2e20100lsh0.html,从该文介绍可知当PinyinDecoderService创建时,初始化工作包括了收集系统静态字典文件信息以及用

2395

QT下谷歌拼音输入法

这是安卓底层的谷歌拼音输入法源码,基于Qt5.4.2

谷歌拼音输入法

这是安卓底层的谷歌拼音输入法源码,基于Qt5.4.2,win7平台。结合开发Qt5虚拟键盘插件使用。

android源码有pinyinime,Android PinyinIME 源码笔记 -- 2. 底层服务启动

PinyinIME输入法启动过程介绍见“附A.1输入法的启动”http://blog.sina.com.cn/s/blog_4177a2e20100lsh0.html,从该文介绍可知当PinyinDecoderService创建时,初始化工作包括了收集系统静态字典文件信息以及用户字典路径信息,然后调用C++代码接口nativeImOpenDecoderFd完成底层服务的启动(另一个C++代码接口...

weixin_28716217的博客 641

Google拼音输入法Android PinyinIME源码含关键代码注释

Android Google拼音输入法PinyinIME源码含关键代码注释

安卓输入法布局修改

安卓输入法简单分析,布局修改等。

shanghai_chenxu的博客 4147

安卓Android源码——注释过的谷歌输入法PinyinIME源码.zip

安卓Android源码——注释过的谷歌输入法PinyinIME源码.zip

DW1000芯片实战:如何用UWB技术打造10厘米精度的室内定位系统(附Arduino代码)

本文是一份基于DW1000芯片和UWB技术的实战指南,详细介绍了如何从零构建一个精度可达10厘米的室内定位系统。内容涵盖硬件选型与连接、软件环境配置、核心的双向测距算法实现,并深入探讨了信号干扰抑制、功耗优化等实战挑战,为物联网开发者提供了完整的Arduino代码和部署思路。

root9的博客 497
上一篇: Android开发实例详解之IMF(Android SDK Sample—SoftKeyboard)
下一篇: Android PinyinIME 源码笔记 -- 2. 底层服务启动
while(1){...}
博客等级 码龄24年 6粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值