输入法(InputMethodService)专栏-生命周期解读

4,826 阅读4分钟

楼主在学习输入法相关的业务的过程中,接触到了InputMethodService。为了记录自己对于谷歌开源的InputMethodService相关的知识的学习过程,决定写一个关于输入法相关的专栏,用来加深自己对输入法的理解,也供网友们做相关的参考,有错误欢迎指正。首先要介绍的是输入法相关的一些知识。

InputMethodService

想实现一个输入法的应用程序,必不可少的就需要了解InputMethodService的生命周期,通过了解InputMethodService的生命周期,掌握input view和候选区域的绘制时机。 我们通过一张输入法生命周期流程图来了解一下整个过程。

接下来我们详细的介绍一下每一个生命周期的特征

onCreate()

输入法创建过程时首先调用该方法.由于常驻在进程当中,在没有OnDestory之前只会调用该方法一次

onInitializeInterface()

紧随着onCreate()方法后调用,用于界面初始化以及用于service运行过程中配置信息发生改变的情况(横竖屏转换等,会触发onConfigurationChanged()方法)

onBindInput

用于发现客户端的变化,当新的客户端绑定到输入法时,该方法会被调用,在输入法第一次启动时,会马上调用onStartInput方法获取编辑框数据,否则,先调用onFinishInput方法,而后调用onStartInput方法

onStartInput

走完onBindInput(),会调用该方法.用于处理客户端发起的输入会话,输入法可以获取到相对应的编辑框的信息,用于决定展示什么类型的键盘.在输入法周期中会频繁的调用.

onCreateInputView()

在该生命周期中主要用于初始化跟input area区域相关的类和变量.

onCreateCandidateView()

在该生命周期中主要用于初始化跟candidate area区域相关的类和变量.

onCreateExtractTextView

在输入法全屏模式下会调用,用于创建并返回用于显示(extracted text)文本信息的区域视图,返回的视图必须包含ExtractEditText,且ID值为inputExtractEditText,默认情况下横屏模式时,输入法为全屏效果。

onConfigureWindow()

通常在窗口发生改变时候调用,比如在获取到输入视图时调用和失去输入视图时.

onStartInputView()

输入视图正在显示并且编辑框输入已经获取焦点时回调该方法用于创建并返回(input area)输入区域的层次视图,该方法只被调用一次(输入区域第一次显示时),该方法可以返回null,此时输入法不存在输入区域,InputMethodService的默认方法实现返回值为空,想要改变已经创建的输入区域视图,我们可以调用setInputView(View)方法,想要控制何时显示输入视图,我们可以实现onEvaluateInputViewShown方法,该方法用来判断输入区域是否应该显示,在updateInputViewShown方法中会调用onEvaluateInputViewShown方法来判断是否显示输入区域.

onStartInputView()

输入视图正在显示并且编辑框输入已经获取焦点时回调该方法,onStartInputView方法总会在onStartInput,onConfigureWindow()方法之后被调用.一般情况下普通的设置可以在onStartInput方法中进行,在onStartInputView方法中进行视图相关的设置,开发者应该保证onCreateInputView方法在该方法被调用之前调用.

onStartCandidiateView()

候选视图正在显示时回调该方法,必须确保候选区域的资源已经初始化过了.一般情况普通的设置可以在onStartInput方法中进行,在onStartCandidatesView方法中进行视图相关的设置,开发者应该保证onCreateCandidatesView方法在该方法被调用之前调用。

onWindowShown()

在onstartinputview方法之后调用,调用该方法时,表示整个输入法是可见的.

hideWindow()

当输入法window失去焦点时调用该方法.

onWindowHidden()

当视图有可见转换为不可见时,调用该方法.一般跟onWindowShown配合使用。

onFinishCandidatesView()

当候选词视图即将被隐藏或者切换到另外的编辑框时调用该方法,finishingInput为true,onFinishInput方法会接着被调用.

onFinishInputView()

当候选词视图即将被隐藏或者切换到另外的编辑框时调用该方法,finishingInput为true,onFinishInput方法会接着被调用.

onFinishInput()

往往在onFinishInputView之后调用,后续可能会接着调用onStartInput方法,或者处于闲置状态,在使用输入法过程中会频繁的调用.

onUnbindInput()

与绑定的客户端失去联系时,会调用该方法.

onDestory()

输入法服务结束时调用.只调用一次.再次方法中做好资源释放的工作

了解输入法生命周期有利于我们在合适的时机去初始化相对应的逻辑,这是自己构建一个输入法程序不可缺少的一部分。后期会从源码的角度更深入的去探究ims,imm之间的通信和关联,敬请期待。