input系统学习----数据分发处理

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

 

参考资料

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

评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值