安卓输入法模块

1.1 安卓IME整体框架

IME整体分为三个部分

1.1.1 输入法客户端(IMM)

主要指输入法框架的InputMethodManager,每个app都一个实例,用来和输入法控制端交互。运行在需要使用输入法的进程。

1.1.2 输入法管理端(IMMS)

主要指输入法框架的InputMethodManagerService,运行在system_server进程,工作内容包含以下:

输入法服务端的绑定

输入法服务端与输入法客户端的绑定

输入法启用/关闭

输入法显示/隐藏

切换输入法

1.1.3 输入法服务端(IMS)

主要指输入法框架的InputMethodService,这是一个输入法服务,真正实现输入法界面,控制字符输入的地方。运行在输入法进程,例如搜狗输入法进程。

1.1.4 子模块交互流程图

输入法的整体交互过程如下:

  1. IMM利用IInputMethodManager请求IMMS

  2. IMMS绑定输入法服务InputMethodService,得到IInputMethod

  3. IMMS请求IInputMethod创建交互IIputMethodSession

  4. IMMS通过IInputMethodClient告知IMM IInputMethodSession

  5. IMM和IMS通过IIputMethodSession和IIputContext交互

1.2 IME初始化启动流程

1.2.1 IME客户端(IMM)初始化流程

涉及代码文件路径: frameworks/base/core/java/android/view/ViewRootImpl.java 
frameworks/base/core/java/android/view/WindowManagerGlobal.java 
frameworks/base/core/java/android/view/inputmethod/InputMethodManager.java 
frameworks/base/core/java/com/android/internal/view/IInputMethodClient.aidl 
frameworks/base/core/java/com/android/internal/view/IInputContext.aidl 
frameworks/base/core/java/com/android/internal/view/IInputMethodManager.aidl 
frameworks/base/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java

IMM子模块运行在需要使用输入法的进程。

IMMS子模块运行在system_server进程。

1.2.2 IME管理端(IMMS)初始化流程

 IMMS运行在system server进程中,属于系统服务的一部分,用于控制输入法的显示/隐藏、切换、绑定等操作。
 
 涉及代码文件路径: frameworks/base/services/java/com/android/server/SystemServer.java 
 frameworks/base/services/core/java/com/android/server/SystemServiceManager.java 
 frameworks/base/core/java/android/os/SystemService.java 
 frameworks/base/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java 
 frameworks/base/packages/SettingsProvider/res/values/defaults.xml

InputMethodManagerService(IMMS)初始化流程:从SystemService启动service开始

1.2.3 IME服务端(IMS)初始化流程

IMS运行在输入法进程, 是一种特殊的输入法后台服务,继承结构为:InputMethodService extends AbstractInputMethodServiceService 输入法服务本质上是一个服务, 使用时需要IMMS通过bindService的方式绑定。 初始化过程在Service的onCreate方法中, 绑定方法在onBind方法中。

 涉及代码文件路径: frameworks/base/core/java/android/view/inputmethod/InputMethodManager.java 
 frameworks/base/core/java/com/android/internal/view/IInputMethodManager.aidl 
 frameworks/base/core/java/android/inputmethodservice/InputMethodService.java 
 packages/inputmethods/LatinIME/java/src/com/android/inputmethod/latin/SystemBroadcastReceiver.java
# 从InputMethodManager.java开始
InputMethodManager.java -- startInput
        ---》 startInputInner

---> IInputMethodManager.aidl -- startInputOrWindowGainedFocus

---> InputMethodManagerService.java -- startInputOrWindowGainedFocus
        ---》 startInputOrWindowGainedFocusInternal
        ---》 startInputOrWindowGainedFocusInternalLocked
        ---》 startInputUncheckedLocked
        ---》 调用bindCurrentInputMethodServiceLocked,启动当前默认的输入法的服务(启动在设置的输入法进程中)
        ---》 调用bindServiceAsUser,例如AOSP提供的packages/inputmethods/LatinIME输入法,可以在AndroidManifest.xml看到输入法service,即此处的绑定的服务
                # 参考packages/inputmethods/LatinIME/java/src/com/android/inputmethod/latin/SystemBroadcastReceiver.java
                ---》 输入法APP中会调用InputMethodManager的setAdditionalInputMethodSubtypes,然后调用到InputMethodManagerService.java对应函数
                ---》 调用buildInputMethodListLocked检查当前默认的输入法(LatinIME)服务是否存在
                ---》 调用setInputMethodEnabledLocked检查默认的LatinIME是否是可用的可用的输入法,如果不可用,则设置为可用(即检查settingprovider数据库的enabled_input_methods信息)

# 输入法应用会继承InputMethodService,比如packages/inputmethods/LatinIME/java/src/com/android/inputmethod/latin/LatinIME.java
# 因此会实现InputMethodService的onCreate函数

# 从onTouchEvent开始,viewClicked流程
1 viewClicked
2 checkFocus
3 startInputInner
4 startInputOrWindowGainedFocus
5 startInputLocked
6 startInputUncheckedLocked
7 attachNewInputLocked

1.3 输入法弹出流程

1.3.1 点击弹出输入法流程

   1 viewClicked流程
       1.1 viewClicked
       1.2 checkFocus
       1.3 startInputInner
       1.4 startInputOrWindowGainedFocus
       1.5 startInputLocked
       1.6 startInputUncheckedLocked
       1.7 attachNewInputLocked
           1.7.1 处理返回的结果
   2 showSoftInput流程
       2.1 showSoftInput
       2.2 IMMS#showSoftInput
       2.3 showCurrentInputLocked
       2.4 IMS$InputMethodImpl$showSoftInput
       2.5 dispatchOnShowInputRequested
       2.6 IMS$showWindow
       2.7 showWindowInner

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值