此文为本人学习输入法之后所做的一个总结报告。与大家分享。

安卓输入法框架(Input Method Framework)IMF

一.输入法框架简介

自Android平台1.5版本以后,Google开放了 Android平台输入法框架(InputMethod Framework, IMF) , IMF是Android平台的特色设计。它的出现大大推动了不带实体键盘的设备的诞生。同时,Android平台输入法框架也给出了输入法的开发所需要的接口,为Android平台的输入法提供了可扩展性。

二.输入法框架组成

一个IMF结构中包含三个主要的部分:
●(输入法服务)input method manager(IMM):管理各部分的交互,是一个客户端API,存在于各个应用程序的context中,用来沟通管理所有进程间交互的全局系统服务,可以通过Context.getSystemService()来获取一个InputMethodManager的实例。
●(输入法应用)input method(IME):实现一个允许用户生成文本的独立交互模块。系统绑定一个当前的输入法。使其创建和生成,决定输入法何时隐藏或者显示它的UI。同一时间只能有一个IME运行。
●(客户端)client application:通过输入法管理器控制输入焦点和IME的状态。一次只能有一个客户端使用IME。

输入法整体框架如图1所示:

图1.输入法的总体框架

2.1 IMM的实现

InputMethodManagerService.java是整个系统当中,一切与输入法有关的地方的总控制中心。它通过管理下面三个模块来实现系统的输入法框架。

(1)WindowManagerService

负责显示输入法,接收用户事件。

(2)InputMethodService

输入法内部逻辑,键盘布局,选词等,最终把选出的字符通过 commitText提交出来。

(3)InputManager

由 UI 控件(View,TextView,EditText等)调用,用来操作输入法。比如,打开,关闭,切换输入法等。

2.2 输入法应用组成

在IMF中,最主要的是输入法应用,他继承于Abstract InputMethodService。InputMethodService主要由以下几个组件构成,其中包括完成输入法的相关UI和文字的输出。

(1)软键盘视图(SoftInput View)

这是软键盘的输入区域,主要完成在触摸屏下和用户的交互输入。onCreateInputView()被调用来进行软键盘视图的实例化;onEvaluateInputViewShown()决定是否显7K软键盘视图;当状态改变的时候,调用updateInputViewShownO来重新决策是否显示软键盘视图。

(2)候选字视图(CandidatesView)

Candidates View也是输入法中一个相当重要的组件。当用户输入字符的时候,显不相关的列表。停止输入的时候,就会自动消失。onCreateCandidatesView()来实例化自己的输入法。和软键盘视图不同的是,候选字视图对整个UI布局不会产生影响。setCandidatesViewShown(boolean)用来设置是否显示候选字视图。

(3)输出字符

字符的输出是InputMethodService最核心的功能,输入法通过InputConnection从IMF来获得字符输出。并且通过不同的编辑器(editor)类型来获取相应的支持。通过 onFinishlnputO和onStartInput(EditorInfo, boolean)方法来进行输入目标的切换。

另外,

onlnitializelnterfaceO用于InputMethodService在执行的过程中配置的改变;

onBindlnputO切换一个新的输入通道;

onStartInput(EditorInfo, boolean)处理一个新的输入。

三.输入法消息流转机制

输入法框架包括客户端、输入法服务和输入法应用三部分组成,如图2所示。输入法框架中消息的流转机制为:当客户端获得焦点,启动输入法,创建一个连接类型对象,以实现输入法框架各个层次间信息的传输。该连接类型实现了InputConnection接口。

图2.输入法消息流转

四.输入法生命周期

输入法是用户、应用程序之间的交互的渠道,所有的输入法应用都需要继承特定的Android平台提供的服务。Android平台的输入法框架为输入法应用定义了一个基类InputMethodService,InputMethodService提供了一个输入法的标准实现流程,定义了输入法生命周期内的重要函数,以方便开发人员对Android输入法进行扩展。图3即为Android输入法生命周期。

图3.Android输入法生命周期

具体的实现步骤为:

1.当用户点击客户端输入控件(如editor),客户端控件获得焦点,InputMethodService启动,调用其onCreate()函数。该函数在输入法第一次启动的时候被调用,用来做初始化的设置;

2. 调用onCreatelnputViewO函数,在该函数中创建键盘视图(KeyboardView)并返

回;

3. 调用onCreateCandidatesView()函数,在该函数中创建候选字视图(Candidates

View)实现并返回;

4. 调用onStartlnput()函数,始接收并处理输入内容;

5. 输入结束后调用onFinishlnputO函数来结束当前的输入;

6. 如果移动到下一个输入框,则重复调用onStartlnputView和onFinishlnput函数;

7. 在输入法关闭的时候调用onDestroy()函数。

五.输入法主要的类和函数

在Android输入法开发过程中,下面三个类的实现比较重要:

InputMethodService类:提供了很多的输入法的基础实现,管理状态的条款、输入法的可见度、与当前可见的Activity沟通;

CandidateView类:提供候选字选择视图,直接继承于View。负责显示软键盘上面的那个候选区域。

LatinKeyboard类:软键盘类,直接继承与Keyboard类。负责解析并保存键盘布局,并提供选词算法,供程序运行当中使用。其中键盘布局是以XML文件存放在资源当中的。

Android的输入法服务,通过一些接口函数与系统进行交互,在这些接口中,主要接口是InputMethodService。它提供了一个输入法的标准实现,开发输入法时可以参照和自定义该实现,表1显示了InputMethodService接口提供的函数。

主要接口函数

说明

onlnitializelnterface

进行UI的初始化,创建和修改时调用此接口

onBindlnput

在另外的客户端和该输入法连接时调用

onStartlnput

初始化整个输入法,非常重要的一个回调,它在

编辑框中用户已经开始输入的时候调用

onCreatelnputView

创建输入视图,返回一个层次性的输入视图,而且只是在这个视图第一次显示的时候被调用

onCreateCandidatesView

创建候选框视图,当需要候选框显示时调用

onCreateExtractTextView

全屏模式下的视图

onStartlnput  View

在输入视图被显示并且在一个新的输入框中输入已经开始的时候调用

getCurrentlnputConnection

此函数呼叫应用程序,接收原始的按键事件

onFinishlnput

结束输入法

表1.InputMethodService接口提供的函数

六.输入法服务流程

6.1客户端应用注册到输入法系统服务

6.1.1创建LocationManger

1)客户端应用创建时,调用ViewRoot(…);

2)调用ViewRoot .getWindowSession(…);

3)通过调用InputMethodManager.getInstance()创建LocationManager对象,一个客户端应用只会创建一个LocationManager对象;

4)LocationManager对象创建时,会创建一个IInputMethodClient对象,同时创建一个IInputContext对象;

6.1.2注册到输入法系统服务

1)调用WindowMangerService. openSession(…);

2)调用WindowMangerService. Session(…);

3)调用InputMethodMangerService.addClient(IInputMethodClientclient, IInputContext inputContext, int uid, int pid),将InputMethodManager中创建的IInputMethodClient对象以及InputMethodManager中创建的IInputContext对象传入进去,其中uid为客户端应用用户ID,pid为客户端应用进程ID;

4)加入到InputMethodManagerService维护的一个列表HashMap<IBinder, ClientState>中,其中IBinder对应IInputMethodClient,一个InputMethodManager只有一个IInputMethodCliend。

6.2客户端应用调用输入法

1)TextView.setText();

2)调用InputMethodManager.restartInput();

3)调用InputMethodManager. startInputInner();

4)  调用InputMethodManagerService. startInput(IInputMethodClient,IInputContext…);

6.3输入法系统服务调用输入法

输入法系统服务调用输入法包括输入法系统服务启动输入法,输入法创建,输入法系统服务建立与输入法的会话,输入法系统服务启动输入法以及输入法服务显示输入法。

七.Android手机输入法设计的主要内容

一款手机输入法能否得到用户的认可,主要取决于输入法的所示。

图 4.Android 输入法模块

Android输入法架构学习总结的更多相关文章

  1. android 开发架构学习

    Android DataBinding(数据绑定)入门与实战 http://examplecode.cn/2018/07/20/android-databinding-01-introduction/ ...

  2. Android开发学习之路--Android系统架构初探

    环境搭建好了,最简单的app也运行过了,那么app到底是怎么运行在手机上的,手机又到底怎么能运行这些应用,一堆的电子元器件最后可以运行这么美妙的界面,在此还是需要好好研究研究.这里从芯片及硬件模块-& ...

  3. (1)-Android学习笔记之:初识Android系统架构和项目结构

    Android系统架构 Android程序结构 创建一个Android项目,为初学便于理解,将程序项目结构切换为Project模式,项目结构如下 .gradle和.idea:这两个目录下放的都是And ...

  4. Android系统架构与系统源码目录

    前言 技术博客终于可以恢复正常的更新速度了,原因是我编写的进阶书籍的初稿已经完成,窃以为它将会是Android应用书籍中最有深度的一本,可以说是<Android开发艺术探索>的姊妹篇.在这 ...

  5. 转:微信Android客户端架构演进之路

    转自: http://www.infoq.com/cn/articles/wechat-android-app-architecture 微信Android客户端架构演进之路 作者 赵原 发布于 20 ...

  6. Android开发最佳学习路线图

          为了帮助大家更好的学习Android开发的相关知识,尚观4G智能操作系统研究室(www.up4g.com)为大家制作下面学习路线图:希望能帮助到广大的android爱好者. 在開始之前我们 ...

  7. Android进阶加密-第1章-Android系统架构-读书笔记

    第 1 章 Android 系统架构 1.1 Android 系统架构 Android 系统架构分为五层,从上到下依次是应用层.应用框架层.系统运行库层.硬件抽象层和 Linux 内核层. 应用层(S ...

  8. Android 技能图谱学习路线

    这里是在网上找到的一片Android学习路线,希望记录下来供以后学习 1Java 基础 Java Object类方法 HashMap原理,Hash冲突,并发集合,线程安全集合及实现原理 HashMap ...

  9. Android开发该学习哪些东西?

    开篇: 本人也是众多Android开发道路上行走的一员,听了不少大神的知乎live,自己也看了不少书,也和不少前辈交流过,所以在这里分享一下Android开发应该学习的书籍以及知识,当然,也包括一些方 ...

随机推荐

  1. 3期浅析宽字节注入-----SQL注入

    通过分类的名称,你就可以找到漏洞银行的hack show视频. 吸收这个知识的几个关键的信息. 1.通过视频得到知识源.         [信息来源] 我怎么从不清楚到知道这个信息来源?这个过程没办法 ...

  2. pydicom读取dicom文件报错

    之前采用pydicom读取dicom文件一切都很正常,不过最近读取一批数据的时候,会报错 读取代码 file = pydicom.read_file(filepath) data = file.pix ...

  3. 【医学影像】《Identifying Medical Diagnoses and Treatable Diseases by Image-Based Deep Learning》论文笔记

    这篇论文的作者是张康教授为首的团队,联合国内外众多医院及科研机构,合力完成,最后发表在cell上,实至名归. 从方法的角度上来说,与上一篇博客中的论文很相似,采用的都是InceptionV3模型,同时 ...

  4. vue,下级页面刷新导致路由跳转带过来的数据消失的解决方法

    if(typeof(this.$route.query.result)=='string'){ //刷新时走这 }else{ //正常路由跳转过来后就把数据塞到 localStorage let ob ...

  5. windows下实现屏幕分享(C#)

    采用UDP广播进行数据的传输,实现windows下进行低延迟的屏幕共享. 开发语言:C# 第三方组件:Redis 1.实现思路 总体流程图 DGIS.DesktopShare实现windows下屏幕分 ...

  6. python 模块和包以及他们的导入关系

    一 模块 1 什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1 使用python编 ...

  7. wiz笔记

    分享本地的wiz笔记到网上 , 成为博客 博客园 http://www.cnblogs.com/您的博客名称/services/metablogapi.aspx // region 图片里面的字段:从 ...

  8. Jquery中.bind()、.live()、.delegate()和.on()之间的区别详解

    简介 最近了解到很多网页开发者对jquery中的 .bind() .live() .delegate() 和 .on() 方法存在很多的疑惑.这些疑惑通常是关于它们之间真正的区别是什么啊,什么时候该使 ...

  9. 3、在Shell程序中使用的参数

    学习目标位置参数内部参数 如同ls命令可以接受目录等作为它的参数一样,在Shell编程时同样可以使用参数.Shell程序中的参数分为位置参数和内部参数等. 12-3-1 位置参数由系统提供的参数称为位 ...

  10. D3学习笔记一

    D3学习笔记一 什么是D3? D3(全称Data Driven Documents)是一个用来做Web数据可视化的JavaScript函数库.D3也称之为D3.js. D3是2011年由Mike Bo ...