ActivityRecordInputSink深入剖析全网独家分析

背景:

学员粉丝朋友们在学习马哥的android framework实战高级课程时候,有一些细心的学员提出了一个无问题,那就是再看dumpsys SurfaceFlinger的图层或者是dumpsys input相关信息时候发现了一个叫做ActivityRecordInputSink的图层。

如下图所示:
dumpsys input可以看到一个ActivityRecordInputSink在Activity的下面
在这里插入图片描述
再看看sf的相关:

在这里插入图片描述以上都看到了一个ActivityRecordInputSink的图层,那么这个图层到底有啥作用呢?其实网络上基本上也没有资料,我这边blog算是一个开疆扩土的探索。。。

线索寻找1:

找到这个类看看有没有相关注释:
在这里插入图片描述
个人翻译理解:

* Creates a InputWindowHandle that catches all touches that would otherwise pass through an* Activity.

字面翻译就是ActivityRecordInputSink会捕获所有本身会穿透Activity的触摸,即ActivityRecordInputSink就相当于一张大网,Activity有点相当于大网上面有一张小网。
即正常情况下Activity这个小网和手机屏幕都是一样大小,所以这个时候其实ActivityRecordInputSink就没啥存在感,因为本身Activity的任何事件都会捕获,根本不会有漏网之鱼事件到ActivityRecordInputSink。
在这里插入图片描述
上图展示的Activity大小和手机屏幕大小一样,所以手机触摸事件根本到达不了ActivityRecordInputSink这个地方。
其实这个也就是ActivityRecordInputSink为啥没引起大家重视原因,因为我们大部分情况下都遇不到它。
可以看看正常情况下两者的dumpsys input的touch区域:

      5: name='8bdb43d com.android.messaging/com.android.messaging.ui.conversationlist.ConversationListActivity', id=567, displayId=0, inputConfig=0x0, alpha=1.00, frame=[0,0][1080,2160], globalScale=1.000000, applicationInfo.name=ActivityRecord{4e0ab6e u0 com.android.messaging/.ui.conversationlist.ConversationListActivity} t201}, applicationInfo.token=0x792c4556f0, touchableRegion=[0,0][1080,2160], ownerPid=3580, ownerUid=10127, dispatchingTimeout=5000ms, hasToken=true, touchOcclusionMode=BLOCK_UNTRUSTEDtransform (ROT_0) (IDENTITY)6: name='a06edb3 ActivityRecordInputSink com.android.messaging/.ui.conversationlist.ConversationListActivity', id=210, displayId=0, inputConfig=NO_INPUT_CHANNEL | NOT_FOCUSABLE, alpha=1.00, frame=[0,0][0,0], globalScale=0.000000, applicationInfo.name=, applicationInfo.token=<null>, touchableRegion=[-10799,-21599][10800,21600], ownerPid=1887, ownerUid=1000, dispatchingTimeout=0ms, hasToken=false, touchOcclusionMode=BLOCK_UNTRUSTEDtransform (ROT_0) (IDENTITY)

可以看到Activity的窗口显示大小就是touchableRegion=[0,0][1080,2160]即和屏幕大小一样,而ActivityRecordInputSink大小是touchableRegion=[-10799,-21599][10800,21600]明显比手机屏幕大很多,这种Activity大小和手机手机屏幕一样,触摸事件正常都不可能到这里。

线索寻找2

那么什么情况下下这个ActivityRecordInputSink才会有相关的作用的呢?
继续寻找一下ActivityRecordInputSink这个类提交log线索:

git log提交

commit 1bc541e8950824f223dc2aba43f09c20f96189a9
Author: Linus Tufvesson <lus@google.com>
Date:   Wed Nov 3 13:56:24 2021 +0000Block touches from passing through activitiesBy setting an InputWindowHandle for ActivityRecord it is no longerpossible for Activities to shrink their own window size to allow touchesto pass through to activities behind. The touchable region is cropped bythe parent, meaning that it will occupy all availble space.Feature is disabled by default and can be enabled per package using adbshell am compat enable ENABLE_TOUCH_OPAQUE_ACTIVITIES <package>Test: Manually enabled appcompat feature and verified with sample fromb/194480991 that touches are blocked.

核心语句翻译:
By setting an InputWindowHandle for ActivityRecord it is no longer
possible for Activities to shrink their own window size to allow touches
to pass through to activities behind. The touchable region is cropped by
the parent, meaning that it will occupy all availble space.

即一旦有了ActivityRecordInputSink后就没有可能出现Activity自己窗口缩小允许触摸事件传递到Activity底部的窗口情况,所有的触摸都会被ActivityRecordInputSink获取。

在这里插入图片描述
如上图activity可能比屏幕小,但是触摸在activity外的触摸不会被传递给底部的window,因为会被ActivityRecordInputSink收走。

通过实际dumpsys来验证看看是否真的是这么一回事?

      5: name='4d95871 com.example.myapplication11/com.example.myapplication11.MainActivity', id=1974, displayId=0, inputConfig=0x0, alpha=1.00, frame=[0,0][864,1536], globalScale=1.000000, applicationInfo.name=ActivityRecord{596e7da u0 com.example.myapplication11/.MainActivity} t51}, applicationInfo.token=0x6f95368f10, touchableRegion=[0,0][864,1536], ownerPid=12666, ownerUid=10138, dispatchingTimeout=5000ms, hasToken=true, touchOcclusionMode=BLOCK_UNTRUSTEDtransform (ROT_0) (SCALE )1.2500  -0.0000  0.0000-0.0000  1.2500  0.00000.0000  0.0000  1.00006: name='1b027ef ActivityRecordInputSink com.example.myapplication11/.MainActivity', id=1979, displayId=0, inputConfig=NO_INPUT_CHANNEL | NOT_FOCUSABLE, alpha=1.00, frame=[0,0][0,0], globalScale=0.000000, applicationInfo.name=, applicationInfo.token=<null>, touchableRegion=[-10799,-19199][10800,19200], ownerPid=9926, ownerUid=1000, dispatchingTimeout=0ms, hasToken=false, touchOcclusionMode=BLOCK_UNTRUSTEDtransform (ROT_0) (IDENTITY)7: name='9fe7939 com.android.launcher3/com.android.launcher3.uioverrides.QuickstepLauncher', id=1952, displayId=0, inputConfig=DUPLICATE_TOUCH_TO_WALLPAPER, alpha=1.00, frame=[0,0][1080,1920], globalScale=1.000000, applicationInfo.name=ActivityRecord{228f121 u0 com.android.launcher3/.uioverrides.QuickstepLauncher} t45}, applicationInfo.token=0x6f95359f70, touchableRegion=[0,0][1080,1920], ownerPid=10363, ownerUid=10111, dispatchingTimeout=5000ms, hasToken=true, touchOcclusionMode=BLOCK_UNTRUSTEDtransform (ROT_0) (IDENTITY)8: name='ada6de9 ActivityRecordInputSink com.android.launcher3/.uioverrides.QuickstepLauncher', id=1851, displayId=0, inputConfig=NO_INPUT_CHANNEL | NOT_FOCUSABLE, alpha=1.00, frame=[0,0][0,0], globalScale=0.000000, applicationInfo.name=, applicationInfo.token=<null>, touchableRegion=[-10799,-19199][10800,19200], ownerPid=9926, ownerUid=1000, dispatchingTimeout=0ms, hasToken=false, touchOcclusionMode=BLOCK_UNTRUSTEDtransform (ROT_0) (IDENTITY)

上面可以看到4d95871 com.example.myapplication11/com.example.myapplication11.MainActivity 这个Activity触摸大小区域:
touchableRegion=[0,0][864,1536]

屏幕大小是1080x1920
但是底下的ActivityRecordInputSink的大小如下
ActivityRecordInputSink com.example.myapplication11/.MainActivity

touchableRegion=[-10799,-19199][10800,19200],
所以有ActivityRecordInputSink在触摸事件不会传递给下面的Launcher

在这里插入图片描述

本文章更多详细代码和资料需要购买课程获取

七件套专题:在这里插入图片描述
点击这里
https://mp.weixin.qq.com/s/Qv8zjgQ0CkalKmvi8tMGaw

hal+perfetto+surfaceflinger
https://mp.weixin.qq.com/s/LbVLnu1udqExHVKxd74ILg
在这里插入图片描述

私聊作者+v(androidframework007)

视频试看:
https://www.bilibili.com/video/BV1wc41117L4/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/723551.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OWASP Top 10 网络安全10大漏洞——A02:A02:2021-加密机制失效

10大Web应用程序安全风险 2021年top10中有三个新类别、四个类别的命名和范围变化&#xff0c;以及一些合并。 A02&#xff1a;A02:2021-加密机制失效 上升一个位置&#xff0c;当前top2&#xff0c;以前称为敏感数据泄露&#xff0c;是一种状况而不是根本原因。更新后的类别…

MacOS开发环境搭建

MacOS开发环境搭建 一、MacOS二、Python三、MacOS搭建Python开发环境1.Python下载地址1.1 Python官网地址1.2 Python下载地址 2.安装Python3.安装Python4.安装PyCharm5.创建一个Python项目6.配置PyCharm7.安装Python包8.运行Python代码9.总结 一、MacOS macOS是一套由苹果开发的…

2024京东Java面试真题解析,每次面试必问的二叉树的设计与编码

一、背景 我们日常在电商网站购物时经常会遇到一些高并发的场景&#xff0c;例如电商 App 上经常出现的秒杀活动、限量优惠券抢购&#xff0c;还有我们去哪儿网的火车票抢票系统等&#xff0c;这些场景有一个共同特点就是访问量激增&#xff0c;虽然在系统设计时会通过限流、异…

前面说什么是前后端分类,那到底是怎么个分类法呢?

前后端分离是指将一个web 系统的动态内容和静态内容进行分离&#xff0c;包括其开发、部署等。 比如传统的 MVC 架构&#xff0c;HTML、JS、CSS… 等前端代码和 Java、spring、mybatis… 等后端代码是在同一个项目中进行开发、部署的。那前后端分离后&#xff0c;就可以分多个项…

学习vue3使用在线官方开发环境play.vuejs.org进行测试

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a; http://122.227.135.243:9666 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a; https://gitee.com/nbach…

C++ STL自定义排序

更具体的看【速记】C STL自定义排序 - 知乎 (zhihu.com) sort sort第三个位置放的greater<int>和less<int>萌新可能会弄错&#xff0c;这两个单词不是更大和更小的意思&#xff0c;而是大于和小于&#xff0c;并且比较就是自定义排序中的前者和后者。 如果是less…

如何使用DS file+cpolar内网穿透实现远程访问本地群晖NAS传输文件

文章目录 1. 群晖安装Cpolar2. 创建TCP公网地址3. 远程访问群晖文件4. 固定TCP公网地址5. 固定TCP地址连接 DS file 是一个由群晖公司开发的文件管理应用程序&#xff0c;主要用于浏览、访问和管理存储在群晖NAS&#xff08;网络附加存储&#xff09;中的文件。这个应用程序具有…

【BUG】Windows状态栏总卡死解决办法

屋漏偏逢连夜雨&#xff0c;正在赶deadline呢&#xff0c;Windows状态老卡死&#xff0c;一时间崩溃。 解决办法&#xff1a; 右键状态栏新闻和咨询关掉 这个烧笔新闻与资讯我真服了

java算法第十五天 | ● 层序遍历 ● 226.翻转二叉树 ● 101.对称二叉树

层序遍历 思路&#xff1a; 需要借用一个辅助数据结构即队列来实现&#xff0c;队列先进先出&#xff0c;符合一层一层遍历的逻辑&#xff0c;而用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。 而这种层序遍历方式就是图论中的广度优先遍历&#xff0c;只不过我们应用在…

在nginx 服务器部署vue项目

以人人快速开发的开源项目&#xff1a;renren-fast-vue 为例 注&#xff1a;这里开始认为各位都会使用nginx 打包vue项目 npm run build 测试打包的项目是否可以运行 serve dist 可以正常运行 编译报错请移步到&#xff1a;renren-fast-vue1.2.2 项目编译报错: build g…

2024三掌柜赠书活动第十三期:API安全技术与实战

目录 前言 API安全威胁与漏洞 API安全技术与实践 API安全实战案例 关于《API安全技术与实战》 编辑推荐 内容简介 作者简介 图书目录 书中前言/序言 《API安全技术与实战》全书速览 结束语 前言 随着互联网的快速发展和应用程序的广泛使用&#xff0c;API&#xff…

贪心刷题3-合并果子

题目来源&#xff1a;[NOIP2004 提高组] 合并果子 / [USACO06NOV] Fence Repair G - 洛谷 参考书目&#xff1a;《深入浅出程序设计竞赛&#xff08;基础篇&#xff09;》 解题思路&#xff1a;这道题的关键在于每次选择合并时都要选择最小的两堆果子来合并&#xff0c;从而保…

MySQL 元数据锁及问题排查(Metadata Locks MDL)

"元数据"是用来描述数据对象定义的&#xff0c;而元数据锁&#xff08;Metadata Lock MDL&#xff09;即是加在这些定义上。通常我们认为非锁定一致性读&#xff08;简单select&#xff09;是不加锁的&#xff0c;这个是基于表内数据层面&#xff0c;其依然会对表的元…

Python之Web开发初学者教程—ubuntu下vi的使用

Python之Web开发初学者教程—ubuntu下vi的使用 vi\vim 文本编辑器 i 切换到输入模式&#xff0c;以输入字符。 x 删除当前光标所在处的字符。 : 切换到底线命令模式&#xff0c;以在最底一行输入命令。 vi 保存并退出&#xff1a;esc键退出编辑-…

Python爬虫——Selenium

简介 Selenium是一个自动化测试框架&#xff0c;可以通过编程语言控制浏览器进行各种操作。在Python中&#xff0c;可以使用Selenium实现爬虫。 首先&#xff0c;我们需要需要安装Selenium库。可以使用pip命令安装&#xff1a; pip install selenium要使用的话我们还需…

用于生成环境噪声的Noisedash

本文中关于音频的专业描述&#xff0c;来自于互联网和 ChatGPT&#xff1b; 什么是白噪声 &#xff1f; 白噪声&#xff08;White Noise&#xff09;是具有平均功率的随机信号&#xff0c;其功率在整个频谱范围内均匀分布。它的能量在所有频率上都是相等的&#xff0c;没有频率…

【Linux C | 网络编程】广播概念、UDP实现广播的C语言例子

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

伟大音乐家的伟大不朽作品,贝多芬一生的音乐作品全集

一、音乐描述 贝多芬一生创作题材广泛&#xff0c;重要作品包括9部交响曲、1部歌剧、32首钢琴奏鸣曲、5首钢琴协奏曲、多首管弦乐序曲及小提琴、大提琴奏鸣曲等。因为其对古典音乐的重大贡献&#xff0c;以及对奏鸣曲式和交响曲套曲结构的发展和创新&#xff0c;而被后世尊称为…

【比较mybatis、lazy、sqltoy、mybatis-flex、easy-query、mybatis-mp操作数据】操作批量新增、分页查询(四)

orm框架使用性能比较 比较mybatis、lazy、sqltoy、mybatis-flex、easy-query、mybatis-mp操作数据 环境&#xff1a; idea jdk17 spring boot 3.0.7 mysql 8.0测试条件常规对象 orm 框架是否支持xml是否支持 Lambda对比版本编码方式mybatis☑️☑️3.5.4lambda xml 优化sq…

Python乱码恢复

比如说网页是ISO-8859-1编码&#xff0c;然后requests得到的是乱码&#xff0c; 那么这样操作就可以还原数据&#xff1a;res.text.encode(‘ISO-8859-1’).decode(‘utf-8’) 乱码恢复网站&#xff0c;可以知道是什么编码http://www.mytju.com/classCode/tools/messyCodeReco…