最近研究了一下Android输入法,发现Android输入法框架中按键消息的处理流程和一般应用程序的处理流程有很大的不同,故在此做个总结。

一、一些名词缩写

IMF(Input MethodFramework):输入法框架

IM(Input Method):输入法

IMS(Input Method Service):输入法服务,一般指一个具体输入法对应的服务

IMMS(Input Method ManagerService):输入法管理器服务,系统进程的一部分,系统中只有一个该服务的实例

IMM(Input Method Manager):输入法管理器,每个客户进程中都包含一个

IME(Input Method Engine/InputMethod Editor):指一个具体的输入法,包括其内部的IMS和Binder对象

CA(Client Application):客户端进程,这里指使用输入法的进程。

二、输入法框架

1、 客户端进程(CA):在每个CA中都存在唯一一个IMM,UI控件(View,TextView,EditText等)可以通过它来访问IMMS,用来操作输入法,比如,打开,关闭,切换输入法等。可以通过Context.getSystemService()来获取一个InputMethodManager的实例。

IMM中有2个Binder对象,一个是可编辑UI控件对应的Binder对象(InputContext),输入法进程可以通过InputContext将虚拟按键事件(即通过触屏消息转换而来的按键事件)传递给UI控件;另一个是InputMethodClient,IMMS将通过它访问CA,例如IMMS通过它将IMS的InputMethodSession传递给CA,从而使得CA可以直接访问IMS。

2、输入法进程:和客户端进程类似,它也有2个Binder对象,一个是IMS对应的Binder对象,IMMS将通过它去控制输入法,例如:显示或者隐藏输入法窗口;另一个是专门供客户端使用的Binder对象,客户端主要通过它来向输入法进程传送按键事件。

具体可参见下图:

Android输入法框架中按键消息的处理流程_第1张图片

三、按键消息的处理流程

具体请见下图:

Android输入法框架中按键消息的处理流程_第2张图片

四、外界物理键盘的判断
当外接物理键盘连接android设备后,可以通过Configuration.KEYBOARD_QWERTY来判断。这里例子可以参见InputMethodService.java中关于软键盘是否显示的判断,代码如下:

    /**     * Override this to control when the soft input area should be shown to     * the user.  The default implementation only shows the input view when     * there is no hard keyboard or the keyboard is hidden.  If you change what     * this returns, you will need to call {@link #updateInputViewShown()}     * yourself whenever the returned value may have changed to have it     * re-evaluated and applied.     */    public boolean onEvaluateInputViewShown() {        Configuration config = getResources().getConfiguration();        return config.keyboard == Configuration.KEYBOARD_NOKEYS                || config.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_YES;    }


更多相关文章

  1. Android init进程——属性服务
  2. android 进程间通信使用aidl和Messenger类
  3. Android中杀进程的几种方法 (1) - killBackgroundProcesses
  4. Android 有输入框的页面,一打开就会弹出输入法,最简单屏蔽办法
  5. android中如何避免被弹出的输入法界面遮盖主界面
  6. 将system_server进程配置成Android Application进程
  7. android进程生命周期
  8. android api (83) ―― InputMethodSession [输入法]
  9. Android系统启动流程(三)解析SyetemServer进程启动过程

随机推荐

  1. Android Context上下文理解
  2. android install faild insufficient sto
  3. mac下安装配置android studio
  4. Thinking in Google Doc - ActionBar讲解
  5. Android 电子罗盘开发。
  6. Android使用ImageView引起Missing conten
  7. Android怎么去除Dialog对话框的白色边框
  8. 〖Android〗联想K860 logcat CM11.0出错
  9. Android Html解析
  10. android下面res目录