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…

玩转centos 下的core 文件

玩转centos 下的core 文件 ------------------------------------------------------------ author: hjjdebug date: 2024年 03月 06日 星期三 12:38:35 CST description: 玩转centos 下的core 文件 ------------------------------------------------------------ 一: 准备一…

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;中的文件。这个应用程序具有…

C++语言入门

1.Hello&#xff0c;World&#xff01; #include <iostream> //使用cout&#xff0c;可调用iostream库 using namespace std; int main() {cout << "Hello,Wordl!" << endl; //输出 Hello World&#xff01;return 0; //结束整个程序 } #in…

【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…

docker中的具名和匿名挂载

1. 匿名挂载 -v 容器内路径 [rootwq ~]# docker run -d -P --name nginx01 -v /etc/nginx nginx b250dffbd5f0d1cb0e4717dab6bf5212ae378869099aa1a6ece08a25519554a7查看所有的volume的情况 [rootwq ~]# docker volume ls DRIVER VOLUME NAME local 2bc73b32eed4d0…

贪心刷题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中的类

_init_()函数 所有类都有一个名为__init__()的函数&#xff0c;它在每次使用类创建新对象时都会自动执行&#xff0c;可用于将用户指定的值在初始就赋给对象的属性&#xff0c;或者在创建对象时执行一些固定操作&#xff0c;如下&#xff1a; class Person:def __init__(self…

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

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

网络学习:Vlan原理

目录 一、交换机对数据帧的处理 1、Access&#xff1a; 2、Trunk&#xff1a; 3、Hybrid&#xff1a; 二、VLAN的划分方式 三、VLAN信息的传播技术&#xff08;MVRP协议&#xff09; 1、VLAN动态注册背景&#xff1a; 2、MVRP技术&#xff1a; 3、MVRP注意点&#xff…

前缀和与差分——练习(一维+二维)

一、前言 前缀和与差分算是很常用的算法&#xff0c;熟记是有必要的。 ——题目来源y总每日一题&#xff0c;感觉正适合模板分块讲解系列。 二、浅谈 我们可以用a数组作为前缀和数组&#xff0c;b数组作为差分数组&#xff0c;因为二者互为逆运算。 他们常常用做优化&#xff…