Android Framework系列之IMF(二)

InputConnection是IMF里面一个重要的接口,他是实现BaseInputConnection和InputConnectionWrapper 上层的接口。主要用于应用程序和InputMethod之间通信的通道,包括实现读取关标周围的输入,向文本框中输入文本以及给应用程序发送各种按键事件。

  1.         InputConnection ic = getCurrentInputConnection();  //获取InputConnection接口
  2.        
  3.         if (ic != null){
  4.             ic.beginBatchEdit();    //开始输入编辑操作                       
  5.             if (isShifted()) {
  6.                     text = text.toString().toUpperCase();
  7.             }                     
  8.             ic.commitText(text, 1); //将text字符输入文本框,并且将关标移至字符做插入态
  9.             ic.endBatchEdit();  //完成编辑输入
  10.         }
复制代码

接口InputMethod是上节说到的AbstractInputMethodService和InputMethodService的上层接口,它可以产生各种按键事件和各种字符文本。

所有的IME客户端都要绑定BIND_INPUT_METHOD,这是IMF出于对安全的角度的考量,对使用InputMethodService的一个所有客户端的强制要求。否则系统会拒绝此客户端使用InputMethod。

  1.         <service android:name="IME"
  2.                 android:label="@string/SoftkeyIME"
  3.                 android:permission="android.permission.BIND_INPUT_METHOD">
复制代码

在这个接口中有

bindInput(InputBinding binding) 绑定一个一个应用至输入法;

createSession(InputMethod.SessionCallback callback) 创建一个新的InputMethodSession用于客户端与输入法的交互;

startInput(InputConnection inputConnection, EditorInfo info) 输入法准备就绪开始接受各种事件并且将输入的文本返回给应用程序;

unbindInput() 取消应用程序和输入法的绑定;

showSoftInput(int flags, ResultReceiver resultReceiver) 和hideSoftInput(int flags, ResultReceiver resultReceiver) 顾名思义是显示和隐藏软键盘输入。

InputMethodSession是一个可以安全暴露给应用程序使用的接口,他需要由InputMethodService和InputMethodSessionImpl 实现。

以下是一段在Framework中取到的代码,可以比较全面的反应这个接口的使用:

  1. final InputMethodSession mInputMethodSession;
  2. public void executeMessage(Message msg) {
  3.         switch (msg.what) {
  4.             case DO_FINISH_INPUT:
  5.                 mInputMethodSession.finishInput();  //应用程序停止接收字符
  6.                 return;
  7.             case DO_DISPLAY_COMPLETIONS:
  8.                 mInputMethodSession.displayCompletions((CompletionInfo[])msg.obj);  //输入法自动完成功能
  9.                 return;
  10.             case DO_UPDATE_EXTRACTED_TEXT:
  11.                 mInputMethodSession.updateExtractedText(msg.arg1,
  12.                         (ExtractedText)msg.obj);
  13.                 return;
  14.             case DO_DISPATCH_KEY_EVENT: {
  15.                 HandlerCaller.SomeArgs args = (HandlerCaller.SomeArgs)msg.obj;
  16.                 mInputMethodSession.dispatchKeyEvent(msg.arg1,
  17.                         (KeyEvent)args.arg1,
  18.                         new InputMethodEventCallbackWrapper(
  19.                                 (IInputMethodCallback)args.arg2));  //处理按键
  20.                 mCaller.recycleArgs(args);
  21.                 return;
  22.             }
  23.             case DO_DISPATCH_TRACKBALL_EVENT: {
  24.                 HandlerCaller.SomeArgs args = (HandlerCaller.SomeArgs)msg.obj;
  25.                 mInputMethodSession.dispatchTrackballEvent(msg.arg1,
  26.                         (MotionEvent)args.arg1,
  27.                         new InputMethodEventCallbackWrapper(
  28.                                 (IInputMethodCallback)args.arg2));
  29.                 mCaller.recycleArgs(args);
  30.                 return;
  31.             }
  32.             case DO_UPDATE_SELECTION: {
  33.                 HandlerCaller.SomeArgs args = (HandlerCaller.SomeArgs)msg.obj;
  34.                 mInputMethodSession.updateSelection(args.argi1, args.argi2,
  35.                         args.argi3, args.argi4, args.argi5, args.argi6); //更新选取的字符
  36.                 mCaller.recycleArgs(args);
  37.                 return;
  38.             }
  39.             case DO_UPDATE_CURSOR: {
  40.                 mInputMethodSession.updateCursor((Rect)msg.obj); //更新关标
  41.                 return;
  42.             }
  43.             case DO_APP_PRIVATE_COMMAND: {
  44.                 HandlerCaller.SomeArgs args = (HandlerCaller.SomeArgs)msg.obj;
  45.                 mInputMethodSession.appPrivateCommand((String)args.arg1,
  46.                         (Bundle)args.arg2); //处理应用程序发给输入法的命令
  47.                 mCaller.recycleArgs(args);
  48.                 return;
  49.             }
  50.             case DO_TOGGLE_SOFT_INPUT: {
  51.                 mInputMethodSession.toggleSoftInput(msg.arg1, msg.arg2); //切换软键盘
  52.                 return;
  53.             }
  54.         }
  55.         Log.w(TAG, "Unhandled message code: " + msg.what);
  56.     }

http://www.pin5i.com/showtopic-android-frameworks-imf-2.html<!-- google_ad_section_end -->

软件特色   支持批量文件(或目录)同时修改;   时间精度为毫秒级;   可进行固定时间、随机时间、平均时间、递增时间方式修改;   *模式下可使用规则定义灵活地生成随机时间;   可将不同的时间进行绑定,如可让创建时间与访问时间相同,不受设定影响;   可选择性地修改文件时间项,如只修改创建时间;   时间输入框支持键盘方向键调节,可以快速切换数据段并调数值;   可随时为本工具增加、删除系统菜单项,删除后不留垃圾,增加后能在文件/目录上右键快速打开本工具。 功能介绍   时间设定模式分为普通模式和*模式,普通模式又分为:固定时间、随机、平均、递增模式。   固定时间模式:按指定的时间进行修改   随机时间模式:设定时间段(即两个时间点),并在时间段内生成随机的时间   平均时间模式:设定时间段(即两个时间点),并根据文件的总数分摊时间值(需要注意文件的排序)   递增递减模式:设定起点一时间,再设定递增(或递减)的量和单位,按文件列表顺序逐步递增(或递减)时间   *模式:也称为*随机模式,可设定自定义规则,分别对不同数据段设定变动范围,能更加灵活地生成所需要的随机时间。   时间绑定:时间绑定是指将创建时间、 修改时间、 访问时间之间进行同步绑定,使绑定的时间相同,被绑定的时间不再受时间设定影响,直接引用绑定时间。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值