Input系统学习-----InputFilter

Android中有2个InputFilter,一般搜到的都是text.InputFilter,

这里我们讨论的是input相关的view.InputFilter,

Input分发流程中有判断是否设置了InputFilter,设置了的话,input流程会走到InputFilter里,

查看InputFilter的定义,竟然是继承了binder的stub对象,看来是可以作为binder服务对象在进程中进行传送数据。

92 * @hide
93 */
94public abstract class InputFilter extends IInputFilter.Stub {

看一下IInputFilter的定义,

frameworks/base/core/java/android/view/IInputFilter.aidl

17package android.view;
18
19import android.view.IInputFilterHost;
20import android.view.InputEvent;
21
22/**
23 * Interface for implementing an filter which observes and
24 * potentially transforms the input event stream in the system.
25 *
26 * @hide
27 */
28oneway interface IInputFilter {
29    void install(IInputFilterHost host);
30    void uninstall();
31    void filterInputEvent(in InputEvent event, int policyFlags);
32}

可以看出,InputEvent,MotionEvent对象可以序列化后通过binder传送。

InputFilter中定义了handler来进行异步处理,编译接收系统的input事件,避免系统的input流程出现阻塞,我们也可以调用filterInputEvent 方法来主动注入一个事件,

149    final public void filterInputEvent(InputEvent event, int policyFlags) {
150        mH.obtainMessage(MSG_INPUT_EVENT, policyFlags, 0, event).sendToTarget();
151    }

handler的定义

213    private final class H extends Handler {
214        public H(Looper looper) {
215            super(looper);
216        }
217
218        @Override
219        public void handleMessage(Message msg) {
220            switch (msg.what) {
221                case MSG_INSTALL:
222                    mHost = (IInputFilterHost) msg.obj;
223                    if (mInboundInputEventConsistencyVerifier != null) {
224                        mInboundInputEventConsistencyVerifier.reset();
225                    }
226                    if (mOutboundInputEventConsistencyVerifier != null) {
227                        mOutboundInputEventConsistencyVerifier.reset();
228                    }
229                    onInstalled();
230                    break;
231
232                case MSG_UNINSTALL:
233                    try {
234                        onUninstalled();
235                    } finally {
236                        mHost = null;
237                    }
238                    break;
239
240                case MSG_INPUT_EVENT: {
241                    final InputEvent event = (InputEvent)msg.obj;
242                    try {
243                        if (mInboundInputEventConsistencyVerifier != null) {
244                            mInboundInputEventConsistencyVerifier.onInputEvent(event, 0);
245                        }
246                        onInputEvent(event, msg.arg1);
247                    } finally {
248                        event.recycle();
249                    }
250                    break;
251                }
252            }
253        }
254    }
255}

参考资料

Android辅助功能---全局手势放大 - 知乎

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值