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ÿ