Android10 InputManagerService事件输入输出

1、Android10 源码编译相关问题

2、Android10 系统进程Zygote启动

3、Android10 系统进程SystemServer

4、Android10 launcher启动流程

5、Android10 系统发送开机广播时机

6、Android10 AppComponentFactory源码梳理

7、Android10 InputManagerService事件输入输出

8、Android10 InputManagerService本地实现

9、Android10 SystemUI系统手势导航


        InputManagerService管理着屏幕点击以及硬件按钮事件的输入输出,InputManagerService的实现是在native代码中,想要对事件进行处理,那就一定要通过InputManagerService进行注册或是监听。如果A应用要想获取到输入事件,那要怎么和InputManagerService连接起来呢?答案是Socket,其中InputChannel就是对其进行封装,InputChannel的实现同样是native代码,实现的类是NativeInputChannel,类路径:frameworks/base/core/jni/android_view_InputChannel.cpp,这里就直接看下InputChannel的openInputChannelPair():

    /**
     * 创建一个新的输入通道对。 一个通道提供给输入调度程序,另一个通道提供给应用程序的输入列。  
     * @param name通道对的描述性(非唯一)名称。  
     * @return 一对输入通道。 第一个通道被指定为服务器通道,应该用于发布输入事件。 第二个通道被指                
     * 定为客户端通道,用于使用输入事件。  
     */
    public static InputChannel[] openInputChannelPair(String name) {
        if (name == null) {
            throw new IllegalArgumentException("name must not be null");
        }

        if (DEBUG) {
            Slog.d(TAG, "Opening input channel pair '" + name + "'");
        }
        return nativeOpenInputChannelPair(name);
    }

    private static native InputChannel[] nativeOpenInputChannelPair(String name);

openInputChannelPair()会创建一对输入通道,一端用于服务器通道,也就是InputManagerService;一端用于客户端,也就是应用这一端。对InputChannel有个初步的了解后,接下来就看主角com.android.server.input.InputManagerService:

public class InputManagerService extends IInputManager.Stub
        implements Watchdog.Monitor {

    // Pointer to native input manager service object.
    private final long mPtr;
    //所有输入事件在分发前,会优先派发到这个回调中处理
    private WindowManagerCallbacks mWindowManagerCallbacks;
    //内部会初始化两个线程,一个用于读取底层的输入事件,一个用于将事件派发到应用层
    private static native long nativeInit(InputManagerService service,
            Context context, MessageQueue messageQueue);
    //前面说InputChannel时会创建一对输入通过对,这里就是将其中的一个注册到底层,也就是所说的服务端
    //InputChannel只会收到注册页面的输入事件
    private static native void nativeRegisterInputChannel(long ptr, InputChannel inputChannel,
            int displayId);
    //解注册页面注册的输入事件
    private static native void nativeUnregisterInputChannel(long ptr, InputChannel inputChannel);
    //这个方法是添加监听,InputChannel会收到所有的输入事件,
    //其中isGestureMonitor表示收到的事件是否是手势,系统的全局手势就是通过这个方法注册的
    private static native void nativeRegisterInputMonitor(long ptr, InputChannel inputChannel,
            int displayId, boolean isGestureMonitor);
    //注入模拟屏幕的点击事件,比如实现全局的返回按钮
    private static native int nativeInjectInputEvent(long ptr, InputEvent event,
            int injectorPid, int injectorUid, int syncMode, int timeoutMillis,
            int policyFlags);

    public InputManagerService(Context context) {
        ... ...
        mPtr = nativeInit(this, mContext, mHandler.getLooper().getQueue());
        ... ...
    }

    //这个回调是在SystemServer中设置的,其实现是InputManagerCallbackÿ
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值