参考资料
Android Pointer location功能研究
https://blog.youkuaiyun.com/zhangqi6627/article/details/108467242
Introduction Android Input of Pointer Location
https://cwgoover.github.io/2016/05/31/android-setting-pointer-location/
InputManagerService分析一:IMS的启动与事件传递
https://blog.youkuaiyun.com/lilian0118/article/details/28617185
十分钟了解Android触摸事件原理(InputManagerService)
https://www.jianshu.com/p/f05d6b05ba17
在开发者选项中,打开 Pointer Location 调试功能,可以显示PointerLocationView 来展示点击信息,这表明,系统的点击事件也发给了PointerLocationView,即可以发给不同的界面(应用),input事件的分发流程是怎样的呢?
Input事件是通过socket进行传送的,下图是传送示意图,通过数据传送的这个简图,可以让我们忽略掉繁琐的细枝末节,从整理入手去理解input数据分发。
socket
IMS <---------------> WMS
|----------------------> APP
socket
Pointer LocationView中的事件获取是WMS中获取到后再分发的,
APP中的事件流程是ims直接通过socket传送给app的,app把socket的fd传给wms,wms又传给IMS,之后IMS就可以和app进行直接通信了。
IMS发送input信息到WMS这部分从Pointer LocationView说起,
打开Pointer Location后,走到
frameworks/base/services/core/java/com/android/server/wm/DisplayPolicy.java
private void enablePointerLocation() {
if (mPointerLocationView != null) {
return;
}
mPointerLocationView = new PointerLocationView(mContext);
mPointerLocationView.setPrintCoords(false);
final WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.MATCH_PARENT);
lp.type = WindowManager.LayoutParams.TYPE_SECURE_SYSTEM_OVERLAY;
lp.flags = WindowManager.LayoutParams.FLAG_FULLSCREEN
| WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
lp.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
if (ActivityManager.isHighEndGfx()) {
lp.flags |= WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED;
lp.privateFlags |=
WindowManager.LayoutParams.PRIVATE_FLAG_FORCE_HARDWARE_ACCELERATED;
}
lp.format = PixelFormat.TRANSLUCENT;
&nb

本文详细探讨了Android系统中输入事件的分发流程,特别是在启用PointerLocation调试功能时,如何通过InputManagerService(IMS)和WindowManagerService(WMS)之间的socket通信来传递和展示触摸信息。当打开PointerLocation,Input事件首先由IMS发送到WMS,然后WMS将事件分发给PointerLocationView和应用程序。同时,文章还分析了InputEventReceiver和PointerEventDispatcher在事件处理中的作用,以及InputChannel在应用和系统服务之间的通信角色。
最低0.47元/天 解锁文章
755





