/frameworks/base/services/java/InputMethodManagerService.java
这是整个系统当中,一切与输入法有关的地方的总控制中心。它通过管理下面三个模块来实现系统的输入法框架。
1、/frameworks/base/services/java/WindowManagerService
负责显示输入法,接收用户事件。
2、/frameworks/base/core/java/android.inputmethodservice/InputMethodService
输入法内部逻辑,键盘布局,选词等,最终把选出的字符通过commitText提交出来。要做一个像搜狗输入法这样的东西的话,主要就是在这里做文章。
3、InputManager
由UI控件(View,TextView,EditText等)调用,用来操作输入法。比如,打开,关闭,切换输入法等。
下面说一下InputMethodManagerService这个控制中心是怎么样与三个模块交互的。
1、与WindowManagerSerivce的交互。
首先,InputMethodManagerService在初始化时,会调用IWindowManager.Stub.asInterface(ServiceManager.getService(Context.WINDOW_SERVICE)),得到IWindowManager这个代理,然后通过IWindowManager与WindowManagerService交互。比如下面这些操作:
调用mIWindowManager.addWindowToken(mCurToken, WindowManager.LayoutParams.TYPE_INPUT_METHOD),让WindowManagerService显示输入法界面。
调用mIWindowManager.removeWindowToken(mCurToken)让输入法界面关闭。
调用mIWindowManager.inputMethodClientHasFocus(client)判断输入法是否聚焦。
2、与InputMethodService的交互。
InputMethodManagerService在内部维护着一个ArrayList<InputMethodInfo> mMethodList。这个列表会在服务启动时通过Pa