IMF的本质
包含了虚拟键盘的系统级窗口,能处理虚拟按键的点击事件,当然也能把字符传递到编辑框中
IMF的核心思想
- 采用Service运行具体的输入法
- 在Service中创建窗口,把输入的内容传递到编辑框中
常见的缩写
IMF:输入法框架
IM:输入法
IMS:输入法服务
IMM:输入法管理器
IMMS:输入法管理器服务
IME:具体的输入法,包括IMS和各种Bind
IMF框架的四个Binder
IMM:
Binder,编辑框对应的Binder,IME通过该Binder将虚拟按键消息传递给编辑框;
IMM对应的Binder,方便IMMS访问客户进程,IMMS需要将IME的Binder传递给客户进程,此后客户进程可直接访问IME;
IME:
IMS对应的Binder,IMMS通过它控制输入法的状态;
专属Binder,客户端调用,将按键消息传递给IME;
按键和触摸消息都要将消息转换为虚拟按键消息–>IMM,编辑框对应的Binder–>编辑框;
不同的是按键消息之间传递到客户端中,然后由客户端先调用IME中的专属Binder,将按键消息装换为虚拟按键消息;触屏消息会直接转换为虚拟按键消息。
Binder对应的实现类
InputConnection,接口,定义了编辑框应该提供的函数接口;
InputMethodClient,aidl文件,方便IMMS想客户端传递一些输入法信息;
InputMethodSession,aidl文件,定义了IMM可以直接访问输入法接口本身的接口;
InputMethod,接口,定义了输入法必须提供的接口
输入法的主要操作
(1)模块启动
客户端-->Connection
客户端-->IMM-->IMMS-->IMS-->IMMS Binder-->Session Binder
-->Connection Binder-->显示-->创建输入法内部视图-->显示
(2)输入法的启动
启动IMS所在的Service;创建Session Binder;
输入法的启动系统自动完成,程序可以让它重启,或者控制显隐;
(3)输入法的显示
1 调用IMMS的windowGainedFoucus();
2 调用IMM的showSoftInput();
3 点击编辑框,弹出输入法;
三种方式,最后都会调用到IMS的showSoftInput()函数
输入法窗口的显示过程
(1)判断当前窗口是否显示;
(2)判断是否真的需要显示输入法窗口;
(3)调用IMS的showWindow函数,获取输入区、候选区、提取区视图,添加到输入法中;
标准布局的IMS
必要条件,实现三个Binder接口
IInputContext,IInterface类型的interface,可重载onCreateInputConnection,返回一个InputConnection(向编辑框传递字符);
IInputMethod,IInterface类型的interface,将被IMMS调用;
IIputMethodSession,IInterface类型的interface,客户端专属;