android物理按键输⼊法,Android输⼊法框架中按键消息的处理
流程
最近研究了⼀下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):客户端进程,这⾥指使⽤输⼊法的进程。
view ui框架⼆、输⼊法框架
1、 客户端进程(CA):在每个CA中都存在唯⼀⼀个IMM,UI控件(View,TextView,EditText等)可以通过它来访问IMMS,⽤来操作输⼊法,⽐如,打开,关闭,切换输⼊法等。可以通过SystemService()来获取⼀个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设备后,可以通过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.
*/
publicbooleanonEvaluateInputViewShown() {undefined
Configuration config = getResources().getConfiguration();
returnconfig.keyboard == Configuration.KEYBOARD_NOKEYS
|| config.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_YES; }
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论