android输入法02:openwnn源码解析01—输入流程
painn代码运行流程

painn代码运行流程下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。
文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by theeditor. I hope that after you download them,they can help yousolve practical problems. The document can be customized andmodified after downloading,please adjust and use it according toactual needs, thank you!In addition, our shop provides you with various types ofpractical materials,such as educational essays, diaryappreciation,sentence excerpts,ancient poems,classic articles,topic composition,work summary,word parsing,copy excerpts,other materials and so on,want to know different data formats andwriting methods,please pay attention!1. 数据准备收集和整理相关的数据,包括输入数据和目标输出数据。
Android核心分析15)Android输入系统之输入路径详解

Android用户事件输入路径1 输入路径的一般原理按键,鼠标消息从收集到最终将发送到焦点窗口,要经历怎样的路径,是Android GWES设计方案中需要详细考虑的问题。
按键,鼠标等用户消息消息的处理可分为不同的情况进行判定:(1)用户输入根据系统状况是否应该派送。
如在ScreenOff的情况下,在按键属于特殊按键的情况下等(2)是否有拦截Listener(3)对按键事件来讲,是否存在输入法(4)是否是焦点终点(5)是否为焦点切换按相关键这些情况都是设计输入路径需要考虑的基本条件。
一般的输入路径设计该输入路径实际上是指的按键消息(MSG_KEYDOWN,MSG_KEYUP,MSG_LongPress)的输入路径,即从活动主窗口到焦点窗口所经历的路程。
将信息输入路径分为两步:Step 1)窗口管理器将信息发送到活动窗口Step 2)活动窗口通过缺省处理函数将该消息一层层的传递到焦点。
这样应用程序可以在活动View的处理函数中来预先处理用户输入信息,从而增强应用对用户信息的控制力。
传递路径是通过View的缺省处理函数Onxxx来完成。
通过ActiveView ->focus->focus->focus的链条关系,一级一级的将按键消息MSG_KEYDO WN,MSG_KEYUP,MSG_CHAR等传递到focus窗口。
此时用户按键输入先发送到输入法窗口,经过输入法管理器处理,过滤后将输入法产生的结果放置到焦点View。
输入系统整体流程下面示意图是Android输入系统的数据流途径,通过WM的输入系统线程收集消息,分发到Focus Activity消息队列,然后通过消息系统派发。
2 Android输入路径详细描述第一步:用户数据收集及其初步判定KeyInputQ在WindowMangerService中建立一个独立的线程InputDev iceReader,使用Native函数readEvent来读取Linux Driver的数据构建Ra w E v e n t,放入到K e y Q消息队列中。
android输入法02:openwnn源码解析02—Keyboard和KeyboardView

android输入法02:openwnn源码解析02—Keyboard和KeyboardView本文主要介绍openwnn对Keyboard和KeyboardView的处理。
这一部分主要涉及三个类:InputViewManager.java,DefaultSoftKeyboard.java,DefaultSoftKeyboardJAJP.java。
其中InputViewManager是与键盘相关的对外接口,DefaultSoftKeyboard是通用类,DefaultSoftKeyboardJAJP是日文定制类。
1、InputViewManager第一步我们先来看看InputViewManager。
这个接口类代码很简单:[java]view plaincopy1./**2. * The interface of input view manager used by OpenWnn.3. *4. * @author Copyright (C) 2009 OMRON SOFTWARE CO., LTD. All Rights Reserved.5. */6.public interface InputViewManager {7. /**8. * Initialize the input view.9. *10. * @param parent The OpenWnn object11. * @param width The width of the display12. * @param height The height of the display13. *14. * @return The input view created in the initialize process; {@code null} if cannot create a input view.15. */16. public View initView(OpenWnn parent, int width, int height);17.18. /**19. * Get the input view being used currently.20. *21. * @return The input view; {@code null} if no input view is used currently.22. */23. public View getCurrentView();24.25. /**26. * Notification of updating parent's state.27. *28. * @param parent The OpenWnn object using this manager29. */30. public void onUpdateState(OpenWnn parent);31.32. /**33. * Reflect the preferences in the input view.34. *35. * @param pref The preferences36. * @param editor The information about the editor37. */38. public void setPreferences(SharedPreferences pref, EditorInfo editor);39.40. /**41. * Close the input view.42. */43. public void closing();44.}从这个接口文件中,我们可以看出在输入法处理中,对于键盘部分需要涉及的操作并不是很多。
【转】Android编译系统详解(三)——编译流程详解

【转】Android编译系统详解(三)——编译流程详解原⽂⽹址:本⽂原创作者: 欢迎转载,请注明出处和1.概述编译Android的第三步是使⽤mka命令进⾏编译,当然我们也可以使⽤make –j4,但是推荐使⽤mka命令。
因为mka将⾃动计算-j选项的数字,让我们不⽤纠结这个数字到底是多少(这个数字其实就是所有cpu的核⼼数)。
在编译时我们可以带上我们需要编译的⽬标,假设你想⽣成recovery,那么使⽤mka recoveryimage,如果想⽣成ota包,那么需要使⽤mka otapackage,后续会介绍所有可以使⽤的⽬标。
另外注意有⼀些⽬标只是起到修饰的作⽤,也就是说需要和其它⽬标⼀起使⽤,共有4个⽤于修饰的伪⽬标:1) showcommands 显⽰编译过程中使⽤的命令2) incrementaljavac⽤于增量编译java代码3) checkbuild⽤于检验那些需要检验的模块4) all如果使⽤all修饰编译⽬标,会编译所有模块研究Android编译系统时最头疼的可能是变量,成百个变量我们⽆法记住其含义,也不知道这些变量会是什么值,为此我专门做了⼀个编译变量的参考⽹站,你可以在该⽹站查找变量,它能告诉你变量的含义,也会给出你该变量的⽰例值,另外也详细解释了编译系统⾥每个Makefile的作⽤,这样你在看编译系统的代码时不⾄于⼀头雾⽔。
编译的核⼼⽂件是和,main.mk主要作⽤是检查编译环境是否符合要求,确定产品配置,决定产品需要使⽤的模块,并定义了许多⽬标供开发者使⽤,⽐如droid,sdk等⽬标,但是⽣成这些⽬标的规则主要在Makefile⾥定义,⽽内核的编译规则放在build/core/task/kernel.mk我们将先整体介绍main.mk的执⾏流程,然后再针对在Linux上编译默认⽬标时使⽤的关键代码进⾏分析。
Makefile主要定义了各个⽬标的⽣成规则,因此不再详细介绍它的执⾏流程,若有兴趣看每个⽬标的⽣成规则,可查看2. main.mk执⾏流程2.1 检验编译环境并建⽴产品配置1) 设置Shell变量为bash,不能使⽤其它shell2) 关闭make的suffix规则,rcs/sccs规则,并设置⼀个规则: 当某个规则失败了,就删除所有⽬标3) 检验make的版本,cygwin可使⽤任意版本make,但是linux或者mac只能使⽤3.81版本或者3.82版本4) 设置PWD,TOP,TOPDIR,BUILD_SYSTEM等变量,定义了默认⽬标变量,但是暂时并未定义默认⽬标的⽣成规则5) 包含,该makefile定义了两个⽬标help和out, help⽤于显⽰帮助,out⽤于检验编译系统是否正确6) 包含,config.mk作了很多配置,包括产品配置,包含该makefile后,会建⽴输出⽬录系列的变量,还会建⽴PRODUCT系列变量,后续介绍产品配置时,对此会有更多详细介绍7) 包含,该makefile会包含所有⼯程的CleanSpec.mk,写了CleanSpec.mk的⼯程会定义每次编译前的特殊清理步骤,cleanbuild.mk会执⾏这些清除步骤8) 检验编译环境,先检测上次编译结果,如果上次检验的版本和此次检验的版本⼀致,则不再检测,然后进⾏检测并将此次编译结果写⼊2.2 包含其它makefile及编译⽬标检测1) 如果⽬标⾥含有incrementaljavac,那么编译⽬标时将⽤incremental javac进⾏增量编译2) 设置EMMA_INSTRUMENT变量的值,emma是⽤于测试代码覆盖率的库3) 包含,该makefile定义了许多辅助函数4) 包含,该makefile定义了⾼通板⼦的⼀些辅助函数及宏5) 包含,该makefile定义了优化dex代码的⼀些宏6) 检测编译⽬标⾥是否有user,userdebug,eng,如果有则告诉⽤户放置在buildspec.mk或者使⽤lunch设置,检测TARGET_BUILD_VARIANT变量,看是否有效7) 包含, PDK主要是能提⾼现有设备升级能⼒,帮助设备制造商能更快的适配新版本的android2.3 根据TARGET_BUILD_VARIANT建⽴配置1) 如果编译⽬标⾥有sdk,win_sdk或者sdk_addon,那么设置is_sdk_build为true2) 如果定义了HAVE_SELINUX,那么编译时为build prop添加属性ro.build.selinux=13) 如果TARGET_BUILD_VARIANT是user或者userdebug,那么tags_to_install += debug 如果⽤户未定义DISABLE_DEXPREOPT为true,并且是user模式,那么将设置WITH_DEXPREOPT := true,该选项将开启apk的预优化,即将apk分成odex代码⽂件和apk资源⽂件4) 判断enable_target_debugging变量,默认是true,当build_variant是user时,则它是false。
Android平台输入法开发解析

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

Android输入系统依照惯例,在研究Android输入系统之前给出输入系统的本质描述:从哲学的观点来看,输入系统就是解决从哪里来又将到哪里去问题。
输入的本质上的工作就是收集用户输入信息并放置到目标位置。
Android在源代码分类上,并没有输入系统分类。
本章的输入系统研究是一个综合的分析,前面的GWES的分析,特别是View的Focus Path以及Window Manager Proxy是本章分析的基础,如果没有理解,请参阅前面的窗口管理的相关章节。
Android输入系统的组成输入系统由如下几部分组成:1)后台窗口管理服务2)Focus Activity3)Focus Window4)Focus View:用来接收键盘消息从输入系统这个角度去看Android的Window Manager服务解决了用户信息输入收集,而FocusActvitiy,Focus Window、Focus View这些概念的设计是为了解决用户输入应该放到哪里去这个问题。
在整个Android系统中,同时只有一个一个Focus Window,而属于该Window的Focus View才是真正的Focus View。
在Android系统中,在设计上要求多个Actvitiy同时存在运行。
在实现中,每次把Actvitiy 变成Focused Actvitiy时(setFocusedActivity@ActivityManagerService.java)激活程序的时候,就把该Activity的主窗口设置成前景窗口,即系统中的顶层窗口,AppToken概念的引进就是为了解决窗口对象的归属问题。
在这个过程中,在逻辑上看,我们挑选了一个Activity作为了Focus Activity来接收系统的消息,实质上这个Focus Activity的Focus窗口就是前景窗口。
Focus窗口的改变将改变焦点View,前景窗口的改变也将引起焦点View的变化。
手机输入代码

MTK平台手机指令大全设置指令:*#66*#中文语言:*#0086# + send查看版本:*#8375#软件版本:*#8882#测试:*#87#调试:*#8899# (?)默认语言:*#0000#+通话键设置英文:*#0044#+通话键繁体中文:*#0886#+通话键简体中文:*#0086#+通话键串号查询:*#06#原厂设置:*#66*#查看版本:*#8375#工厂指令:*#3646633#自动测试:*#87#软件版本:*#8882#*#035670766*001#*#035670766*002#有一些机器开机输入*#66*#不进测试的。
可以在开机瞬间,在按键灯亮和开机音乐响的时候快速按*#*#............*#就可进入测试科达Q191(MT6228平台)有些好象不支持,可惜啊..........诺基亚是国际知名手机品牌,它在中国市场上一直占据着很大一部分销售份额。
诺基亚手机拥有着时尚的外观和强大的功能,尤其是它出色的性能,经久耐用。
是赢得很多消费者喜爱的主要原因。
不少消费者在购买诺基亚手机之后,都会拿着说明书仔细阅读使用说明。
然而,不管是什么牌子的手机除了说明书上的那些说明文字之外,都还有很多用户并不知晓的操作命令!而这些使用命令却能够给我们的使用上提供很大的帮助。
1 输入*#06#:显示IMEI码2 输入*#0000#:显示软件版本 (部分型号如果不起作用,可按*#型号代码#,如*#6110#)第一行--软件版本;第二行--软件发布日期;第三行--手机型号3 输入*#92702689#查询更多的手机信息。
有五个选项(可用上下方向键选择):①Serial No.:手机的IMEI码。
②Made:手机的制造日期. (本人用的是诺基亚6108, 上面写的是092003, 即为2003年09月生产的 )③Purchasing Date:购买日期,此日期一经设定不可更改,新机子应该是mmyyyy④Repaired:维修次数的记录。
麦子学院Android开发教程输入事件流程

EventHub对输入设备进行了封装。
输入设备驱动程序对用户空间应用程序提供一些设备文件,这些设备文件放在/dev/input里面。
EventHub扫描/dev/input下所有设备文件,并打开它们。
1.bool EventHub::openPlatformInput(void)2.{3....4.mFDCount = 1;5.mFDs = (pollfd *)calloc(1, sizeof(mFDs[0]));6.mDevices = (device_t **)calloc(1, sizeof(mDevices[0]));7.mFDs[0].events = POLLIN;8.mDevices[0] = NULL;9.10.res = scan_dir(device_path);11....12.return true;13.}14.EventHub对外提供了一个函数用于从输入设备文件中读取数据。
1.bool EventHub::getEvent(int32_t* outDeviceId, int32_t* outType,2.int32_t* outScancode, int32_t* outKeycode, uint32_t *outFlags,3.int32_t* outValue, nsecs_t* outWhen)4.{5....6.while(1) {7.8.// First, report any devices that had last been added/removed.9.if (mClosingDevices != NULL) {10.device_t* device = mClosingDevices;11.LOGV("Reporting device closed: id=0x%x, name=%s\n",12.device->id, device->path.string());13.mClosingDevices = device->next;14.*outDeviceId = device->id;15.if (*outDeviceId == mFirstKeyboardId) *outDeviceId = 0;16.*outType = DEVICE_REMOVED;17.delete device;18.return true;19.}20.if (mOpeningDevices != NULL) {21.device_t* device = mOpeningDevices;22.LOGV("Reporting device opened: id=0x%x, name=%s\n",23.device->id, device->path.string());24.mOpeningDevices = device->next;25.*outDeviceId = device->id;26.if (*outDeviceId == mFirstKeyboardId) *outDeviceId = 0;27.*outType = DEVICE_ADDED;28.return true;29.}30.31.release_wake_lock(WAKE_LOCK_ID);32.33.pollres = poll(mFDs, mFDCount, -1);34.35.acquire_wake_lock(PARTIAL_WAKE_LOCK, WAKE_LOCK_ID);36.37.if (pollres <= 0) {38.if (errno != EINTR) {39.LOGW("select failed (errno=%d)\n", errno);leep(100000);41.}42.continue;43.}44.45.for(i = 1; i < mFDCount; i++) {46.if(mFDs[i].revents) {47.LOGV("revents for %d = 0x%08x", i, mFDs[i].revents);48.if(mFDs[i].revents & POLLIN) {49.res = read(mFDs[i].fd, &iev, sizeof(iev));50.if (res == sizeof(iev)) {51.LOGV("%s got: t0=%d, t1=%d, type=%d, code=%d, v=%d",52.mDevices[i]->path.string(),53.(int) _sec, (int) _usec,54.iev.type, iev.code, iev.value);55.*outDeviceId = mDevices[i]->id;56.if (*outDeviceId == mFirstKeyboardId) *outDeviceId = 0;57.*outType = iev.type;58.*outScancode = iev.code;59.if (iev.type == EV_KEY) {60.err = mDevices[i]->layoutMap->map(iev.code, outKeycode, outFlags);61.LOGV("iev.code=%d outKeycode=%d outFlags=0x%08x err=%d\n",62.iev.code, *outKeycode, *outFlags, err);63.if (err != 0) {64.*outKeycode = 0;65.*outFlags = 0;66.}67.} else {68.*outKeycode = iev.code;69.}70.*outValue = iev.value;71.*outWhen = s2ns(_sec) + us2ns(_usec);72.return true;73.} else {74.if (res<0) {75.LOGW("could not get event (errno=%d)", errno);76.} else {77.LOGE("could not get event (wrong size: %d)", res);78.}79.continue;80.}81.}82.}83.}84....85.}对于按键事件,调用mDevices->layoutMap->map进行映射。
Android系统输入事件分发详解Android培训教程

Android系统输入事件分发详解Android培训教程什么是输入事件?我们知道,运行android系统的设备本质上是一台计算机,使用者在和计算机进行交互的时候可以抽象成简单的对计算机的输入和输出(IO)。
那么对于运行在计算机上的操作系统来说,操作系统在与使用者进行交互的时候起始也是可以抽象成对外界的输入进行处理,然后在输出返还给使用者。
本文只讨论的是android系统中的“输入事件”(因为本文讨论的都是输入事件,所以以下简称“输入事件”为“事件”)相关的内容。
根据以上描述,我们就可以回答上面的问题了:事件是计算机设备接收到的输入信息。
有了以上的定义,我们先来研究下事件是怎么产生的?Android系统中,事件是由用户的动作触发的,进而在android硬件层引起硬件状态的变化,android底层会将硬件的状态的变化封装成更加高级的类对象并传递到android 的Framework层,Framework会继续把事件传递给应用层(确切地说是应用层里面应用开发者编写的具体的View的子类对象),最终应用层层会根据事件来进行响应并将响应结果通过对硬件的调用反馈给用户。
在以上的整个过程中,应用开发者只需要关注其中的一小部分就可以了,那就是事件从Framework层传递到应用层之后我们该怎么处理这些事件。
当然,本文也主要讨论这些内容。
借用以下android 架构图来展示下事件从底层到应用层经历了多少过程。
android架构图注意:事件的传递并不是只传递一个单一的事件的,每一次用户的动作都会产生一个有序的事件列表,这个有序的事件列会被按顺序一次传递到应用层。
输入事件类型android中所有的事件被抽象成了一个Java类,InputEvent。
它有两个直接子类,MotionEvent 和KeyEvent,分别代表了动作事件(通常由触摸屏所产生,也是最常见的)的事件和按键所产生的事件。
但是事实上InputEvent不止有这两种。
android高仿微信表情输入与键盘输入代码(详细实现分析)

android高仿微信表情输入与键盘输入代码(详细实现分析)表情与键盘的切换输入大部分im都会需要到,之前自己实现了一个,还是存在些缺陷,比如说键盘与表情切换时出现跳闪问题,这个困扰了我些时间,不过所幸在github(其代码整体结构很不错)并且在论坛上找些解决思路,再加上研究了好几个开源项目的代码,最后终于苦逼地整合出比较不错的实现效果(这里不仅给出了实现方案,还提供一个可拓展的fragment模板以便大家实现自己的表情包)代码我已进行另外的封装与拓展,大家需要其他表情的话只需要根据fragment模板实现自己的表情界面,然后根据工厂类获取即可,实现效果如下。
1. emotionkeyboard.java, (表情操作核心类)2. emotioncomplatefragment.java(表情fragment模板)3. fragmentfactory.java,(生产表情fragment模板工厂类)4. emotionutils.java(表情字符转换工具)5. globalonitemclickmanagerutils.java(全局监听类)1.解决表情与键盘切换跳闪问题1.1跳闪问题概述为了让大家对这个问题有一定了解,我先来个简单案例,用红色面板代表表情面板,效果如下:图(1-1)图(1-2)我们先来看图(1-1),即上图,通过上图我们可以看出,当表情显示时,我们点击表情按钮,隐藏表情显示软件盘时,内容bar有一个明显的先向下后恢复的跳闪现象,这样用户体验相当的差,我们希望的是下图(1-2)的效果,无论怎么切换都不会有跳闪现象,这就是我所有说的键盘与表情切换的跳闪问题。
到这里,我们对这个问题有了大概了解后,再来深入分析如何实现图(1-2)的不跳闪效果。
这里我们做个约定,我们把含有表情那个bar统称为内容bar。
1.2 解决跳闪问题的思路:android系统在弹出软键盘时,会把我们的内容bar 顶上去,因此只有表情面板的高度与软键盘弹出时高度一致时,才有可能然切换时高度过渡更自然,所以我们必须计算出软键盘的高度并设置给表情面板。
android输入法02:openwnn源码解析04—设置界面

mWnn.getResources().getString(R.string.keyboard_skin_id_default) );
Log.d("OpenWnn", "keyboard_skin="+skin);
这里需要注意一个问题,就是说在 openwnn_pref_ja.xml 中有一个比较特别的 配置项。你点击“日语用户词典”和“英语用户词典”,它转到的是一个新的 Activity。 我们来看一下这些配置项:
<PreferenceScreen android:key="user_dictionary_edit_words"
}
/** @see android.preference.DialogPreference#onDialogClosed */
@Override protected void onDialogClosed(boolean positiveResult) {
super.onDialogClosed(positiveResult);
android:entryValues="@array/keyboard_skin_id"
android:defaultValue="keyboard_android_default" /> </PreferenceCategory>
这里实际上是自定义了一个 ListPreference。这个类源码如下:
/** @see android.preference.PreferenceActivity#onCreate */ @Override public void onCreate(Bundle savedInstanceState) {
android输入法01:SoftKeyboard源码解析02

android输入法01:SoftKeyboard源码解析02本篇为SoftKeyboard源代码注释。
1、LatinKeyboard[java]view plaincopy1.public class LatinKeyboard extends Keyboard {2.3. private Key mEnterKey;4.5. public LatinKeyboard(Context context, int xmlLayoutResId) {6. super(context, xmlLayoutResId);7. Log.i("mytest", "LatinKeyboard_LatinKeyboard");8. }9.10. public LatinKeyboard(Context context, int layoutTemplateResId,11. CharSequence characters, int columns, int horizontalPadding) {12. super(context, layoutTemplateResId, characters, columns, horizontalPadding);13. Log.i("mytest", "LatinKeyboard_LatinKeyboard");14. }15.16. /*17. * 描绘键盘时候(由构造函数 )自动调用18. * */19. @Override20. protected Key createKeyFromXml(Resources res, Row parent, int x, int y,21. XmlResourceParser parser) {22. Log.i("mytest", "LatinKeyboard_createKeyFromXml");23. Key key = new LatinKey(res, parent, x, y, parser);24. //重载的目的,好像仅仅是为了记录回车键的值而已(以Key型记录)25. //无非就是想对回车键做改观26. if (key.codes[0] == 10) {27. mEnterKey = key;28. }29. return key;30. }31.32. /**33. * This looks at the ime options given by the current editor, to set the34. * appropriate label on the keyboard's enter key (if it has one).35. */36. void setImeOptions(Resources res, int options) {37. //在SoftKeyboard的StartInput函数最后用到了38. //传入了EditorInfo.imeOptions类型的options参数。
Android InputMethod

Android 自帶的輸入法有三種,分別為Android Keyboard、谷歌拼音输入法、Japanese IME。
它们实际上就是app,输入法应用程序。
源码在:/home/$USER/administrator/source_code/qct/DataDisk/U7699EP-wharton/Linux/pac kages/inputmethods里面,对应为LatinIME、PinyinIME、OpenWnn。
Android的输入法框架比较复杂。
从进程的角度来讲,相关功能主要分布在下面三个位置:客户端应用是一个包含有图形界面的应用,如地址本。
图形界面上包含有能够接收输入的编辑框,如TextView。
输入法模块提供软键盘,将用户在软键盘上的按键输入根据某种算法(如Zi, T9, 国笔等)转换成单词,然后传递给客户端应用。
平台部分实现一些管理功能,负责装载某个输入法模块,启动,终止该模块等。
创建一个输入法,必须继承android.inputmethodservice.InputMethodService,它作为一个服务,监听所有EditText的事件。
下面是实现一个基本的输入法程序的步骤。
1. 建立一个继承自android.inputmethodservice.InputMethodService 的类,称为输入法的服务类。
2. 在AndroidManifest.xml 文件中配置这个服务类。
3. 编写一个用于显示软键盘的布局文件。
4. 覆盖InputMethodService类的onCreateInputView 方法。
5. onCreateInputView 方法需要返回与第3步建立的布局文件对应的View 对象。
在返回之前,一般需要设置相应控件的事件,如软键盘按钮单击事件。
6. 在输入法服务类或其他类中编写响应软键盘中按键事件的代码,如按钮单击事件、物理键盘事件等。
在用户触发输入法显示的时候(点击输入框),InputMethodService启动,然后调用onCreate() 函数,该函数在输入法第一次启动的时候调用,适合用来做一些初始化的设置,切忌不要在代码中直接调用该函数;然后调用onCreateInputView() 函数,在该函数中创建KeyboardView并返回;然后调用onCreateCandidatesView()函数,在该函数中创建候选区实现并返回;然后调用onStartInputView(EditorInfo attribute, boolean restarting)函数来开始输入内容,输入结束后调用onFinishInput()函数来结束当前的输入,如果移动到下一个输入框则重复调用onStartInputView和onFinishInput函数;在输入法关闭的时候调用onDestroy() 函数。
Android源码编译命令详解(一)

Android源码编译命令详解(⼀)Android的优势就在于其开源,⼿机和平板⽣产商可以根据⾃⼰的硬件进⾏个性定制⾃⼰的⼿机产品,如⼩⽶,LePhone,M9等,因此,在我们在对Android的源码进⾏定制的时候,很有必要了解下,Android的编译过程。
如果你从来没有做过Android代码的编译,那么最官⽅的编译过程就是查看Android的官⽅⽹站:但是,这⼉只是告诉你了如何去编译⼀个通⽤的系统,并没有详细告诉你细节,我们跟着编译过程来了解下。
+--------------------------------------------------------------------------------------------------------------------+本⽂使⽤Android版本为2.1,采⽤开发板为华清远见研发的FS_S5PC100 A8开发板。
+--------------------------------------------------------------------------------------------------------------------+1. source build/envsetup.sh这个命令是⽤来将envsetup.sh⾥的所有⽤到的命令加载到环境变量⾥去,我们来分析下它。
envsetup.sh⾥的主要命令如下:[plain] function help() # 显⽰帮助信息function get_abs_build_var() # 获取绝对变量function get_build_var() # 获取绝对变量function check_product() # 检查productfunction check_variant() # 检查变量function setpaths() # 设置⽂件路径function printconfig() # 打印配置function set_stuff_for_environment() # 设置环境变量function set_sequence_number() # 设置序号function settitle() # 设置标题function choosetype() # 设置typefunction chooseproduct() # 设置productfunction choosevariant() # 设置variantfunction tapas() # 功能同choosecombofunction choosecombo() # 设置编译参数function add_lunch_combo() # 添加lunch项⽬function print_lunch_menu() # 打印lunch列表function lunch() # 配置lunchfunction m() # make from topfunction findmakefile() # 查找makefilefunction mm() # make from current directoryfunction mmm() # make the supplied directoriesfunction croot() # 回到根⽬录function cproj()function pid()function systemstack()function gdbclient()function jgrep() # 查找java⽂件function cgrep() # 查找c/cpp⽂件function resgrep()function tracedmdump()function runhat()function getbugreports()function startviewserver()function stopviewserver()function isviewserverstarted()function smoketest()function runtest()function godir () # 跳到指定⽬录# 这是系统⾃动增加了⼀个默认的编译项 generic-eng# add the default one here<strong><span style="color:#ff0000;">add_lunch_combo generic-eng</span></strong># 下⾯的代码很重要,它要从vendor⽬录下查找vendorsetup.sh⽂件,如果查到了,就加载它# Execute the contents of any vendorsetup.sh files we can find.<strong><span style="color:#ff0000;">for f in `/bin/ls vendor/*/vendorsetup.sh vendor/*/build/vendorsetup.sh 2> /dev/null`doecho "including $f". $fdone</span></strong>function help() # 显⽰帮助信息function get_abs_build_var() # 获取绝对变量function get_build_var() # 获取绝对变量function check_product() # 检查productfunction check_variant() # 检查变量function setpaths() # 设置⽂件路径function printconfig() # 打印配置function set_stuff_for_environment() # 设置环境变量function set_sequence_number() # 设置序号function settitle() # 设置标题function choosetype() # 设置typefunction chooseproduct() # 设置productfunction choosevariant() # 设置variantfunction tapas() # 功能同choosecombofunction choosecombo() # 设置编译参数function add_lunch_combo() # 添加lunch项⽬function print_lunch_menu() # 打印lunch列表function lunch() # 配置lunchfunction m() # make from topfunction findmakefile() # 查找makefilefunction mm() # make from current directoryfunction mmm() # make the supplied directoriesfunction croot() # 回到根⽬录function cproj()function pid()function systemstack()function gdbclient()function jgrep() # 查找java⽂件function cgrep() # 查找c/cpp⽂件function resgrep()function tracedmdump()function runhat()function getbugreports()function startviewserver()function stopviewserver()function isviewserverstarted()function smoketest()function runtest()function godir () # 跳到指定⽬录# 这是系统⾃动增加了⼀个默认的编译项 generic-eng# add the default one here<strong><span style="color:#ff0000;">add_lunch_combo generic-eng</span></strong># 下⾯的代码很重要,它要从vendor⽬录下查找vendorsetup.sh⽂件,如果查到了,就加载它# Execute the contents of any vendorsetup.sh files we can find.<strong><span style="color:#ff0000;">for f in `/bin/ls vendor/*/vendorsetup.sh vendor/*/build/vendorsetup.sh 2> /dev/null`doecho "including $f". $fdone</span></strong>根据上⾯的内容,可以推测出,如果要想定义⾃⼰的产品编译项,简单的办法是直接在envsetup.sh最后,添加上add_lunch_combo myProduct-eng,当然这么做,不太符合上⾯代码最后的本意,我们还是⽼实的在vendor⽬录下创建⾃⼰公司名字,然后在公司⽬录下创建⼀个新的vendorsetup.sh,在⾥⾯添加上⾃⼰的产品编译项[plain] #mkdir vendor/farsight/#touch vendor/farsight/vendorsetup.sh#echo "add_lunch_combo fs100-eng" > vendor/farsight/vendorsetup.sh#mkdir vendor/farsight/#touch vendor/farsight/vendorsetup.sh#echo "add_lunch_combo fs100-eng" > vendor/farsight/vendorsetup.sh这样,当我们在执⾏source build/envsetup.sh命令的时候,可以在shell上看到下⾯的信息:[plain] including vendor/farsight/vendorsetup.shincluding vendor/farsight/vendorsetup.sh2. 按照android官⽹的步骤,开始执⾏lunch full-eng当然如果你按上述命令执⾏,它编译的还是通⽤的eng版本系统,不是我们个性系统,我们可以执⾏lunch命令,它会打印出⼀个选择菜单,列出可⽤的编译选项如果你按照第⼀步中添加了vendorsetup.sh那么,你的选项中会出现:[plain] You're building on Linuxgeneric-eng simulator fs100-engLunch menu... pick a combo:1. generic-eng2. simulator3. fs100-engYou're building on Linuxgeneric-eng simulator fs100-engLunch menu... pick a combo:1. generic-eng2. simulator3. fs100-eng其中第3项是我们⾃⼰添加的编译项。
基于Android平台的蒙古文输入法研究与实现

学位论文作者签名: 日
彦竖
期:
指导教师签名: 日
迎壅塑岁
期:趔绰缒筌
⑧内蒙古大学硕士毕业论文(设计)
基于Android平台的蒙古文输入法研究与实现
摘要
随着智能手机一步步走进普通人的生活,它将成为人们获取信 息的主要设备。2007年11月12号,开放手机联盟(Open Handset Alliance)发布Google Android
Mongolian
the Android platform.
KEYWORDS:Mongolian
input method;Embedded
system;Menksoft
font;Android;
Mobile
IV
⑧内蒙古大学硕士毕业论文(设计)
目录
一绪论………………………………………………………………………………………1 1.1课题研究背景和意义…………………………………………………………………1
Android
platform.Secondly,to the
IMF(Input Method
llI
Frame)principle
based
on
the Android platform,the article discusses the
implementation technology of including the antedating
不包含为获得凼墓直太堂及其他教育机构的学位或证。15而使用过的材料。与我一同T作的同
志对本研究所做的任何贡献均已在论文中作了明确的说明并表示谢意。
学位论文作者签名: 曰 期:
丝丝垒竺壁堕
趟一
指导教师签名: 日
Android 中文api (81)——InputMethod [输入法]
![Android 中文api (81)——InputMethod [输入法]](https://img.taocdn.com/s3/m/cf619a9b69dc5022aaea00c3.png)
Android 中文api (81)——InputMethod [输入法]一、结构public interface InputMethod extends Objectandroid.view.inputmethod.InputMethod间接子类AbstractInputMethodService.AbstractInputMethodImpl,InputMethodService.InputMethodImpl二、类概述InputMethod接口代表了输入法,它可生成按键事件,生成文本,如数字,email地址,CJK字符,其它语言字符等等。
在处理输入事件时,将文本返回至需要文本输入的应用程序。
InputMethodManager可得到更多关于架构的信息。
应用程序通常不使用这个接口本身,而是依靠TextView 和EditText提供的标准交互。
输入法实现通常为InputMethodService及其子类的派生。
在实现输入法时,包含它的服务控件必须提供SERVICE_META_DATA元数据字段,该元数据字段联接至一包含输入法细节的XML资源。
所有输入法也必定要求客户端包含BIND_INPUT_METHOD以便与服务控件交互。
如果不这样,系统将无法使用输入法,因其无法确认是否完整。
InputMethod接口实际上分为两部分:接口是输入法的最高级接口,提供所有的访问,只有系统能访问(需要BIND_INPUT_METHOD权限)。
另外调用方法createSession(android.view.inputmethod.InputMethod.SessionCallback)可实例化InputMethodSession副接口,用于与客户端通讯。
三、内部类interface InputMethod.SessionCallback四、常量public static final String SERVICE_INTERFACE接口名字,实现输入法的服务应说明它支持输入法,也就是它将用于意向过滤器(intent filter)。
android输入法01:SoftKeyboard源码解析01

android输入法01:SoftKeyboard源码解析01本文主要介绍android自带输入法实例SoftKeyboard的源码,共分为两篇:第一篇为SoftKeyboard框架概述,第二篇为源码注释。
1、IMF简介一个IMF结构中包含三个主要的部分:•i nput method manager:管理各部分的交互。
它是一个客户端API,存在于各个应用程序的context中,用来沟通管理所有进程间交互的全局系统服务。
•i nput method(IME):实现一个允许用户生成文本的独立交互模块。
系统绑定一个当前的输入法。
使其创建和生成,决定输入法何时隐藏或者显示它的UI。
同一时间只能有一个IME运行。
•c lient application:通过输入法管理器控制输入焦点和IME的状态。
一次只能有一个客户端使用IME。
1.1 InputManager由UI控件(View,TextView,EditText等)调用,用来操作输入法。
比如,打开,关闭,切换输入法等。
它是整个输入法框架(IMF)结构的核心API,处理应用程序和当前输入法的交互。
可以通过Context.getSystemService()来获取一个InputMethodManager的实例。
在开发过程中,最基础最重要的就是养成阅读API的习惯。
优秀的程序员要养成把自己关在小黑屋里,断绝与外界的联网和联系,仅仅靠自己电脑中的开发环境和API文档,以及漂亮女仆送来的每天三顿饭,写出优秀的程序。
这个在武侠小说中叫闭关,在软件开发中叫Clean Room,哈哈。
Android的API文档在:%SDK_ROOM%/docs/reference/index.html,InputManager类的位置:%SDK_ROOM%/docs/reference/android/view/inputmethod/InputMethodManager.html 由于,该类跟本次要讲的Sample关系不大,这里就不详细分析,请各位自行阅读API doc吧。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
android输入法02:openwnn源码解析01—输入流程
之后要开始android日文输入法的测试,因此现在开始研究android输入法。
之前两篇文章已经对android自带的输入法实例softkeyboard的源码进行了解析。
这一系
列将开始学openwnn的源码。
openwnn是一家日本公司开发的开源输入法框架,涉及中文、日文、韩文。
目
前已经加入到了android源码之中。
因此你打开一个模拟器时,会发现其中有一个japanese ime的输入法,其服务名为openwnn,这个就是openwnn的日文输入法。
1、日文输入
本文章主要以日文输入法为主。
为了方便大家阅读,先对日文输入法做一个简
单的介绍:
•日文输入法分为罗马音输入法(类似中文拼音)和假名输入法(类似中文五笔)。
比如,你要输入”可愛“,则用罗马音输入,需要输入”kawai“,然后
在候选词中选择”可愛“;若使用假名输入,则需要输入”かわい“,在候选中
选择”可愛“。
•日文由平假名、片假名(分全角片假名和半角片甲名)和汉字组成。
通常学日语的人会说到50音图,就是日语50个平假名(与之对应有50个片假名)的读音。
其中平假名是由汉字演化而来的,类似于日文的拼音,比如”可愛
“的日文读音就是”かわい“。
片假名是由于外来语的入侵,原来平假名无法表
达所有的外文内容而设计的。
这里,如果你读到ComposingText.java这个类时,其中会涉及到三个输入层:
第一层为原始输入,比如输入的按键;第二层为假名层;第三层为最终显示结果,
一般为汉字与假名的混合体。
以前面那个例子,在罗马音输入法模式下,第一层
为”kawai“,第二层为”かわい“,第三层为”可愛“。
若你不懂日文的一些基本特点,这
一个地方有可能看不懂。
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 plaincopy
1./** Candidate view */
2.protected CandidatesViewManager mCandidatesViewManager = null;
3./** Input view (software keyboard) */
4.protected InputViewManager mInputViewManager = null;
5./** Conversion engine */
6.protected WnnEngine mConverter = null;
7./** Pre‐converter (for Romaji‐to‐Kana input, Hangul input, etc.) */
8.protected LetterConverter mPreConverter = null;
9./** The inputing/editing string */
10.protected ComposingText mComposingText = null;
11./** The input connection */
12.protected InputConnection mInputConnection = null;
13./** Auto hide candidate view */
14.protected boolean mAutoHideMode = true;
15./** Direct input mode */
16.protected boolean mDirectInputMode = true;
17.
18./** Flag for checking if the previous down key event is consumed by Ope
nWnn */
19.private boolean mConsumeDownEvent;
这些变量的作用如文字说明。
其中跟我们需要介绍相关的是InputViewManager和CandidatesViewManager,前者负责维护Keyboard和KeyboardView,后者负责维护CandidateView。
从这个类的方法中我们可以到其中主要是输入法生命周期方法以及输入法处理。
下面我们来看看OpenWnnJAJP.java,其中的公用方法为:
从这些方法中我们可以看到,这些方法主要也是应用输入法的处理流程中。
有需要的同学可以按照第一张输入法流程图对应的类来看看相关的
函数代码,就可以对其输入法流程有比较深刻的认识。