InputMethodService详解

来源:互联网 发布:宗庆后 虚拟经济 知乎 编辑:程序博客网 时间:2024/06/05 10:21

InputMethodService类提供了对输入法的标准实现,我们可以对InputMethodService类进行派生和定制,InputMethodService类继承了AbstractInputMethodService类并实现了InputMethod接口。

除了存在于Service生命周期的回调方法,InputMethodService类添加了一些子类都希望用到的新的回调方法:
onInitializeInterface方法用于用户界面初始化,主要用于service运行过程中配置信息发生改变的情况(横竖屏转换等)。
onBindInput方法用于发现客户端的变化,当新的客户端绑定到输入法时,该方法会被调用,在输入法第一次启动时,会马上调用onStartInput方法获取编辑框数据,否则,先调用onFinishInput方法,而后调用onStartInput方法。
onStartInput方法用于处理客户端发起的输入会话,当编辑框已经开启了文字输入的时候回调该方法,输入法可以通过该回调函数获取编辑框信息,并通过编辑框信息初始化相关数据(显示的键盘类型等)。
onCreateInputView方法用于创建并返回(input area)输入区域的层次视图,该方法只被调用一次(输入区域第一次显示时),该方法可以返回null,此时输入法不存在输入区域,InputMethodService的默认方法实现返回值为空,想要改变已经创建的输入区域视图,我们可以调用setInputView(View)方法,想要控制何时显示输入视图,我们可以实现onEvaluateInputViewShown方法,该方法用来判断输入区域是否应该显示,在updateInputViewShown方法中会调用onEvaluateInputViewShown方法来判断是否显示输入区域。
onCreateCandidatesView方法用于创建并返回(candidate view)候选词区域的层次视图,该方法只被调用一次(候选次区域第一次显示时),方法可以返回null,此时输入法不存在候选词区域,InputMethodService的默认方法实现返回值为空。想要改变已经创建的候选词区域视图,我们可以调用setCandidatesView(View)方法,想要控制何时显示候选词视图,我们可以实现setCandidatesViewShown(boolean)方法。
onCreateExtractTextView方法在输入法全屏模式下会调用,用于创建并返回用于显示(extracted text)文本信息的区域视图,返回的视图必须包含ExtractEditText,且ID值为inputExtractEditText,默认情况下横屏模式时,输入法为全屏效果。
onStartInputView方法 输入视图正在显示并且编辑框输入已经开始的时候回调该方法,onStartInputView方法总会在onStartInput方法之后被调用,普通的设置可以在onStartInput方法中进行,在onStartInputView方法中进行视图相关的设置,开发者应该保证onCreateInputView方法在该方法被调用之前调用。
onStartCandidatesView方法 候选词视图已经显示时回调该函数,该方法会在onStartInput方法之后被回调,普通的设置可以在onStartInput方法中进行,在onStartCandidatesView方法中进行视图相关的设置,开发者应该保证onCreateCandidatesView方法在该方法被调用之前调用。
onFinishCandidatesView(boolean finishingInput)方法 当候选词视图即将被隐藏或者切换到另外的编辑框时调用该方法,finishingInput为true,onFinishInput方法会接着被调用。
onFinishInputView(boolean finishingInput)方法 当候选词视图即将被隐藏或者切换到另外的编辑框时调用该方法,finishingInput为true,onFinishInput方法会接着被调用。
onFinishInput方法 通知输入法上一个编辑框的文本输入结束,这时,输入法可能会接着调用onStartInput方法来在新的编辑框中进行输入,或者输入法处于闲置状态,当输入法在同一个编辑框中重启时不会调用该方法
onUnbindInput方法 当绑定的客户端和当前输入法失去联系时调用该方法,通过调用getCurrentInputBinding方法和getCurrentInputConnection方法来判断是否存在联系,若两个方法的返回值无效,则客户端与当前输入法失去联系。
InputMethodService提供了一个基本的UI元素架构(包括输入视图,候选词视图,全屏模式),但是开发者可以决定各个UI元素如何实现,例如,我们可以用键盘输入的方式实现一个输入视图,也可以用手写的方式来实现输入视图,所有的UI元素都被集成在了InputMethodService提供的窗口中,具体的UI元素包括:
soft input view(输入视图):放置在屏幕底部
the candidates view(候选词视图):放置在输入视图上面

extracted text view(提取文本视图):存在于全屏模式,如果输入法没有运行在全屏模式,客户端会移动或重新调整大小以保证客户端视图在输入法视图的上面,如果输入法运行在全屏模式,输入法窗口会完全覆盖客户端窗口,此时,输入法窗口中会包含extracted text视图,该视图中包含客户端正在被编辑的文字信息。

IME最重要的部分就是对应用产生文本信息,这通过调用InputConnetion接口来实现,我们可以通过getCurrentInputConnection方法来得到InputConnection接口,通过该接口可以产生raw key事件,如果目标编辑框支持,我们可以直接编辑候选词字符串并提交。我们可以从EditorInfo类中获得目标编辑框期望并支持的输入格式,通过调用getCurrentInputEditorInfo方法来获取EditorInfo类,其中最重要的是EditorInfo.inputType,如果inputType的值为EditorInfo.TYPE_NULL,则该目标编辑框不支持复杂的信息,只支持原始的按键信息(字母,数字,符号,不支持表情,汉字等合成信息),Type类型可以是password(密码类型)、电话号码类型等。当用户在不同编辑框之间切换时,输入法框架会调用onFinishInput方法和onStartInput方法,你可以通过这两个方法来重置或初始化输入状态。

InputMethodService公有方法介绍:
public boolean enableHardwareAcceleration():该方法在API-21中被舍弃,从API-21开始,硬件加速功能在支持的设备上始终启用,该方法必须在onCreate方法之前被调用,所以,你可以在构造函数中调用该方法。
public int getCandidatesHiddenVisibility():当候选词区域未显示时,调用该函数获取候选词区域的显示模式(INVISIBLE 或者 GONE),默认的实现会调用isExtractViewShown方法,若isExtractViewShown方法返回true,getCandidatesHiddenVisibility方法返回值为GONE,否则返回值为INVISIBLE。
public boolean isExtractViewShown():返回是否显示extract view视图,该方法只在isFullscreenMode方法返回true的情况下才有可能返回true。这种情况下,是否显示extract view主要决定于上次调用的setExtractViewShown(boolean)方法。
public boolean isFullscreenMode():判断当前输入法是否运行在全屏模式,该方法的返回值决定于updateFullscreenMode()。
public void updateFullscreenMode():评估当前输入法是否应该运行在全屏模式,当模式改变时重画UI组件,该方法会调用onEvaluateFullscreenMode方法来决定是否开启全屏模式,用户可以通过isFullscreenMode方法来判断当前是否运行在全屏模式。
public InputBinding getCurentInputBinding ():返回当前活跃的InputBinding,不存在返回null。

public InputConnection getCurrentInputConnection():返回当前活跃的InputConnection,不存在返回null。

public EditorInfo getCurrentInputEditorInfo():获取编辑框信息。
public CharSequence getTextForImeAction(int imeOptions):返回可以应用于EditorInfo.imeOptions的按钮标签。
public boolean isShowInputRequested():如果输入法被请求显示输入视图,返回值为true。
public void onConfigurationChaged(Configuration reconfigure):用于处理配置信息改变,InputMethodService的子类一般不需要直接处理配置改变信息,在标准的实现中,当配置信息改变时,该方法会调用相关的UI方法,所以,你可以依靠onCreateInputView等方法来处理配置信息改变的情况。
public void onDisplayCompletions(CompletionInfo[] completions):当客户端报告auto-completion候选词需要输入法显示的时候回调该函数,典型应用于全屏模式,默认的实现不做任何事情。
public boolean onEvaluateFullscreenMode():重写该方法来控制输入法何时运行在全屏模式,默认的实现在landscape mode(横屏模式)时,输入法运行在全屏模式,如果你改变了该方法的返回值,那么你需要在该返回值可能改变时调用updateFullscreenMode()方法,该方法会调用onEvaluateFullscreenMode函数,并当返回值与上一次不同时重绘UI组建
public boolean onEvaluateInputViewShown():重写该方法来控制何时向用户显示输入区域,默认的实现在不存在硬键盘或键盘被遮盖时显示软件盘输入区域,你应该在该方法的返回值可能改变时调用updateInputViewShown()方法
public boolean onExtractTextContextMenuItem(int id):This is called when the user has selected a context menu from the extracted text view,when running in fullscreen mode. The default implementation sends this action to the current InputConnection'sperformContextMenuAction(int),for it to be processed in underlying "real" editor
public void onExtractedCursorMovement(int dx,int dy):This is called when the user has performed a cursor movement in the extracted text view, when it is running in fullscreen mode. The default implementation hides the candidates view when a vertical movement happens, but only if the extracted text editor has a vertical scroll bar because its text doesn't fit. Re-implement this to provide whatever behavior you want.
public void onExtractedSelectionChanged(int start,int end):用户在extracted text视图中移动光标时调用该方法,默认的实现会把对应的信息传递给底层的编辑框。
public void onExtractedTextClicked():当用户点击extracted text视图时调用该方法,默认的实现会隐藏候选词视图,当extracted text视图存在竖直滚动条时。
public void onExtractingInputChanged(EditorInfo ei):全屏模式时,输入对象改变时,调用该方法,默认的实现当新的对象 is not a full editor,自动隐藏IME。
onKeyDown、onKeyLongPress、onKeyMultiple、onKeyUp用于劫持按键信息,返回值为ture,则代表此消息已经被消费
public void onUpdateExtractedText(int token,ExtractedText text):当应用报告新的extracted text信息需要显示时调用该方法,默认的实现会把新的文本放到extract edit视图中。
public void onUpdateExtractingViews(EditorInfo ei):全屏模式下当editor信息改变时,回调该函数,用于更新UI信息,例如如何显示按钮等
public void onUpdateExtractingVisibility(EditorInfo ei):全屏模式下当editor信息改变时,回调该函数,用于判断extracting(extract text和candidates)是否显示。
public void onUpdateSelection(int oldSelStart,int oldSelEnd,int newSelStrat,int newSelEnd,int candidatesStart,int candidatesEnd):当应用报告新的文本选择区域时回调该函数,无论输入法是否请求更新extracted text,onUpdateSelection都会被调用,尽管如此,当extracted text也改变的时候,输入法不会调用onUpdateSelection,在该方法中要小心处理setComposingText、commitText或者deleteSurroundingText方法,可能引起死循环。
public void onWindowHidden():当输入法界面已经被隐藏时调用该方法
public void onWindowShown():当输入法界面已经显示给用户时调用该方法
public void requestHideSelf(int flags):关闭输入法界面,输入法还在运行,但是用户不能通过触控屏幕来输入信息
public void sendDownUpKeyEvents(int keyEventCode)
public void sendKeyChar(char charCode)

2 0
原创粉丝点击