翟浩浩Android 2012-05-12
整个输入法框架(IMF)结构的核心API,应用程序之间进行调度和当前输入法交互。你可以用Context.getSystemService()取得这一接口的实例。
架构总述(ArchitectureOverview)
输入法框架(IMF)共有三个主要部分:
*输入法管理器,管理各部分的交互。它是一个客户端API,存在于各个应用程序的context中,用来沟通管理所有进程间交互的全局系统服务。
*输入法(IME),实现一个允许用户生成文本的独立交互模块。系统绑定一个当前的输入法。使其创建和生成,决定输入法何时隐藏或者显示它的UI。同一时间只能有一个IME运行。
*客户应用程序,通过输入法管理器控制输入焦点和IME的状态。一次只能有一个客户端使用IME。
应用程序(Applications)
大多数情况下,使用标准TextView或其子类的应用程序只要做少量工作就可以让软键盘(softinputmethods)正常工作。你要注意的是:
*正确设置你的可编辑文本视图inputType,这样输入法有足够的上下文帮助用户向其输入文本。
*当输入法显示时妥善处理隐藏屏幕空间。理想的情况下应用程序应处理窗口变小,如必要你可以利用系统执行平移窗口。你应在活动(activity)中设置windowSoftInputMode属性或调整创建窗口的相应值,以便系统决定平移或缩放(它会尝试自动调整但可能出错)。
*你还可以通过相同的windowSoftInputMode控制窗口的首选软键盘状态(打开、关闭等)。
通过API可以与IMF及其IME交互实现更细致的控制,如显示或输入区域,用户选取某输入法等。
当你编写自己的文本编辑器的时候,你要实现onCreateInputConnection(EditorInfo)以返回你的InputConnection的接口实例,用来允许IME和你的文本编辑域来交互。
输入法(InputMethods)
一个输入法(IME)是Service(服务)的实现,通常继承自InputMethodService。IME提供核心的InputMethod接口,尽管提供InputMethod通常是由InputMethodService来处理,而IME的实现只需要处理更高层的API。
更多信息参阅InputMethodService。
安全(Security)
输入法关系到许多安全问题,因其基本不受约束地驱动UI并监视用户输入。Android输入法框架还允许调度第三方IME,所必须小心以限制他们的选择和相互作用。
以下是IMF背后安全架构的要点:
*只允许系统访问经BIND_INPUT_METHOD权限许可访问IME的InputMethod接口。通过绑定到要求这个权限的服务来强制实现这一点。所以系统可以保证没有不被信任的客户端在它的控制之外访问到当前的输入法。
*IMF中可能有许多客户进程,但在同一时间只有一个是激活的。未激活客户端不能与IMF核心交互通过下述机制实现。
*输入法客户端只可访问InputMethodSession接口。每个客户端创建一个接口实例,只有与激活客户相关联的会话的调用才会被IME处理。这点通过普通IME的AbstractInputMethodService执行,必须由IME显式的处理,而IME正是InputMethodSession的自定义实现。
*只有激活的InputConnection接受操作。IMF通知每个客户进程是否激活,IMF忽略非激活进程对当前输入联接的调用。这确保了当前IME只将事件和文本编辑交付用户可见焦点的UI。
*一个IME永远不能在屏幕关闭时与InputConnection交互。这是通过当屏幕关闭时所有客户端无效,并防止不良IME在用户无法关注其行为时驱动UI。
*客户应用程序可以要求系统选取一个新的IME,但不能编程式选择之一。这是避免恶意程序在用户导航到其它应用程序时,选择自己的IME并保持运行。也就是说,IME可以编程式的要求系统选择其它IME,因它完全控制了用户输入。
用户在可切换至一个新的IME前必须显式的启用它,以确认系统了解它,使其处于可用状态。
三、常量
publicstaticfinalintHIDE_IMPLICIT_ONLY
hideSoftInputFromWindow(IBinder,int)中的标志,表示如果用户未显式地显示软键盘窗口,则隐藏窗口。
常量值:1(0x00000001)
publicstaticfinalintHIDE_NOT_ALWAYS
hideSoftInputFromWindow(IBinder,int)中的标志,表示软键盘窗口总是隐藏,除非开始时以SHOW_FORCED显示。
常量值:2(0x00000002)
publicstaticfinalintRESULT_HIDDEN
showSoftInput(View,int,ResultReceiver)和hideSoftInputFromWindow(IBinder,int,ResultReceiver)中ResultReceiver结果代码标志:软键盘窗口从显示切换到隐藏时的状态。
常量值:3(0x00000003)
publicstaticfinalintRESULT_SHOWN
showSoftInput(View,int,ResultReceiver)和hideSoftInputFromWindow(IBinder,int,ResultReceiver)中ResultReceiver结果代码标志:软键盘窗口从隐藏切换到显示时的状态。
常量值:2(0x00000002)
publicstaticfinalintRESULT_UNCHANGED_HIDDEN
showSoftInput(View,int,ResultReceiver)和hideSoftInputFromWindow(IBinder,int,ResultReceiver)中ResultReceiver结果代码标志:软键盘窗口不变保持隐藏时的状态。
常量值:1(0x00000001)
publicstaticfinalintRESULT_UNCHANGED_SHOWN
showSoftInput(View,int,ResultReceiver)和hideSoftInputFromWindow(IBinder,int,ResultReceiver)中ResultReceiver结果代码标志:软键盘窗口不变保持显示时的状态。
常量值:0(0x00000000)
publicstaticfinalintSHOW_FORCED
showSoftInput(View,int)标志,表示用户强制打开输入法(如长按菜单键),一直保持打开直至只有显式关闭。
常量值:2(0x00000002)
publicstaticfinalintSHOW_IMPLICIT
showSoftInput(View,int)标志,表示隐式显示输入窗口,非用户直接要求。窗口可能不显示。
常量值:1(0x00000001)
四、公共方法
publicvoiddisplayCompletions(Viewview,CompletionInfo[]completions)
(译者注:输入法自动完成)
publicInputMethodSubtypegetCurrentInputMethodSubtype()
(译者注:获取当前输入法类型?)
publicList<InputMethodInfo>getEnabledInputMethodList()
(译者注:获取已启用输入法列表?)
publicList<InputMethodSubtype>getEnabledInputMethodSubtypeList(InputMethodInfoimi,booleanallowsImplicitlySelectedSubtypes)
publicList<InputMethodInfo>getInputMethodList()
(译者注:获取输入法列表)
publicMap<InputMethodInfo,List<InputMethodSubtype>>getShortcutInputMethodsAndSubtypes()
publicvoidhideSoftInputFromInputMethod(IBindertoken,intflags)
关闭/隐藏输入法软键盘区域,用户不再看到或与其交互。只能由当前激活输入法调用,因需令牌(token)验证。
参数
token在输入法启动时提供令牌验证,验证后可对其进行操作。
flags提供额外的操作标志。当前可以为0或HIDE_IMPLICIT_ONLY,HIDE_NOT_ALWAYS等位设置。
publicbooleanhideSoftInputFromWindow(IBinderwindowToken,intflags)
hideSoftInputFromWindow(IBinder,int,ResultReceiver)的无返回值版:从窗口上下文中确定当前接收输入的窗口,隐藏其输入法窗口
参数
windowToken由窗口请求View.getWindowToken()返回得到的令牌(token)。
flags提供额外的操作标志。当前可以为0或HIDE_IMPLICIT_ONLY位设置。
publicbooleanhideSoftInputFromWindow(IBinderwindowToken,intflags,ResultReceiverresultReceiver)
从窗口上下文中确定当前接收输入的窗口,要求隐藏其软键盘窗口。它可由用户调用并得到结果而不仅仅是显式要求输入法窗口隐藏。
参数
windowToken由窗口请求View.getWindowToken()返回得到的令牌(token)。
flags提供额外的操作标志。当前可以为0或HIDE_IMPLICIT_ONLY位设置。
resultReceiver如不为空,当IME处理请求告诉你完成时调用。你收到的结果码可以是RESULT_UNCHANGED_SHOWN,RESULT_UNCHANGED_HIDDEN,RESULT_SHOWN,或RESULT_HIDDEN。
publicvoidhideStatusIcon(IBinderimeToken)
(译者注:隐藏状态栏图标?)
publicbooleanisAcceptingText()
当前服务视图接受全文编辑返回真。没有输入法联接为false,这时其只能处理原始按键事件。
publicbooleanisActive(Viewview)
视图为当前输入的激活视图时返回真。
publicbooleanisActive()
输入法中的任意视图激活时返回真。
publicbooleanisFullscreenMode()
判断相关输入法是否以全屏模式运行。全屏时,完全覆盖你的UI时,返回真,否则返回假。
publicbooleanisWatchingCursor(Viewview)
如当前输入法要看到输入编辑者的光标位置时返回真。
publicvoidrestartInput(Viewview)
如有输入法联接至视图,重启输入以显示新的内容。可在以下情况时调用此方法:视图的文字导致输入法外观变化或有按键输入流,如应用程序调用TextView.setText()时。
参数
view文字发生变化的视图。
publicvoidsendAppPrivateCommand(Viewview,Stringaction,Bundledata)
对当前输入法调用InputMethodSession.appPrivateCommand()。
参数
view可选的发送命令的视图,如你要发送命令而不考虑视图附加到输入法,此项可以为空。
action执行的命令名称。必须是作用域的名称,如前缀包名称,这样不同的开发者就不会创建冲突的命令。
data命令中包含的任何数据。
publicbooleansetCurrentInputMethodSubtype(InputMethodSubtypesubtype)
(译者注:此方法为3.0中新增的方法)
publicvoidsetInputMethod(IBindertoken,Stringid)
强制切换到新输入法部件。只能由持有token的应用程序(application)或服务(service)调用当前激活输入法。
参数
token在输入法启动时提供令牌验证,验证后可对其进行操作。
id切换到新输入法的唯一标识。
publicvoidsetInputMethodAndSubtype(IBindertoken,Stringid,InputMethodSubtypesubtype)
强制切换到一个新的输入法和指定的类型。只能由持有token的应用程序(application)或服务(service)调用当前激活输入法。(译者注:此方法为3.0中新增的方法)
参数
token在输入法启动时提供令牌验证,验证后可对其进行操作。
id切换到新输入法的唯一标识。
subtype切换到新输入法的新类型。
publicvoidshowInputMethodAndSubtypeEnabler(StringtopId)
(译者注:此方法为3.0中新增的方法)
publicvoidshowInputMethodPicker()
(译者注:显示输入法菜单列表)
publicbooleanshowSoftInput(Viewview,intflags,ResultReceiverresultReceiver)
如需要,显式要求当前输入法的软键盘区域向用户显示。当用户与视图交互,用户表示要开始执行输入操作时,可以调用此方法。
参数
view当前焦点视图,可接受软键盘输入。
flags提供额外的操作标志。当前可以是0或SHOW_IMPLICIT位设置。
resultReceiver如不为空,当IME处理请求告诉你完成时调用。你收到的结果码可以是RESULT_UNCHANGED_SHOWN,RESULT_UNCHANGED_HIDDEN,RESULT_SHOWN,或RESULT_HIDDEN。
publicbooleanshowSoftInput(Viewview,intflags)
showSoftInput(View,int,ResultReceiver)的无返回值版:如需要,显式要求当前输入法的软键盘区域向用户显示。
参数
view当前焦点视图,可接受软键盘输入。
flags提供额外的操作标志。当前可以是0或SHOW_IMPLICIT位设置。
publicvoidshowSoftInputFromInputMethod(IBindertoken,intflags)
显示输入法的软键盘区域,这样用户可以到看到输入法窗口并能与其交互。只能由当前激活输入法调用,因需令牌(token)验证。
参数
token在输入法启动时提供令牌验证,验证后可对其进行操作。
flags提供额外的操作标志。可以是0或SHOW_IMPLICIT,SHOW_FORCED位设置。
publicvoidshowStatusIcon(IBinderimeToken,StringpackageName,inticonId)
(译者注:显示状态栏图标?)
publicbooleanswitchToLastInputMethod(IBinderimeToken)
publicvoidtoggleSoftInput(intshowFlags,inthideFlags)
(译者注:切换软键盘)
publicvoidtoggleSoftInputFromWindow(IBinderwindowToken,intshowFlags,inthideFlags)
本方法切换输入法的窗口显示。如输入窗口已显示,它隐藏。如无输入窗口则显示。
参数
windowToken由窗口请求View.getWindowToken()返回得到的令牌(token)。
showFlags提供额外的操作标志。当前可以为0或HIDE_IMPLICIT_ONLY位设置。
hideFlags提供额外的操作标志。可以是0或HIDE_IMPLICIT_ONLY,HIDE_NOT_ALWAYS位设置。
publicvoidupdateCursor(Viewview,intleft,inttop,intright,intbottom)
返回窗口的当前光标位置。
publicvoidupdateExtractedText(Viewview,inttoken,ExtractedTexttext)
(译者注:当内容变化时文本编辑器调用此方法,通知其新提取文本。)
publicvoidupdateSelection(Viewview,intselStart,intselEnd,intcandidatesStart,intcandidatesEnd)
返回当前选择区域。
用户邮箱,应当只允许输入英文字母,数字和@.两个符号,用户手机,应当只能输入数字,禁止输入其他字符。用户密码,应当不能输入空格以及中文字符等。这里列举上述三种场景下的android:digits配置。