Android 在AMS中拦截某个指定Activity的启动

文章目录

    • Android在AMS中拦截某个具体Activity的启动
    • 方案一(推荐):在ActivityTaskManagerService.startActivityAsUser方法中去作拦截
    • 方案二:在Dialog.show()方法中直接对这个包名所创建的Dialog做限制

Android在AMS中拦截某个具体Activity的启动

  最近在开发的过程中遇到这样一个问题,Android13项目带有GMS应用和服务的情况下,如果在系统中操作Location(位置信息),com.google.android.gms这个应用会弹出一个关于Location相关的提示框,因此非常影响我当下的业务需求和使用,所以我们研究如何屏蔽这个来自GMS的应用发出的弹窗。

  通过adb命令可以查询当前Activity的包名和具体Calss名

adb shell dumpsys activity |findstr "mFocus"

方案一(推荐):在ActivityTaskManagerService.startActivityAsUser方法中去作拦截

system/frameworks/base/services/core/java/com/android/server/wm/ActivityTaskManagerService.java

  AMS(ActivityManagerService)先校验一下Activity的正确性,如果正确的话,会暂存一下Activity的信息。然后,AMS会通知Launcher程序pause Activity(在AMS所在进程执行)

下面是AMS启动Activity的调用流程():

  • ActivityManagerService.startActivity

  • ActivityTaskManagerService.startActivity

  • ActivityTaskManagerService.startActivityAsUser(我是在这一步进行Activity的拦截的,因为这个方法中的参数比较明显,基本可以直接调用)

private final String GOOGLE_PACKAGE = "com.google.android.gms";
private final String GOOGLE_LOCATION_ACTIVITY = "com.google.android.gms.location.settings.LocationOffWarningActivity";private int startActivityAsUser(IApplicationThread caller, String callingPackage,@Nullable String callingFeatureId, Intent intent, String resolvedType,IBinder resultTo, String resultWho, int requestCode, int startFlags,ProfilerInfo profilerInfo, Bundle bOptions, int userId, boolean validateIncomingUser) {assertPackageMatchesCallingUid(callingPackage);enforceNotIsolatedCaller("startActivityAsUser");//........省略多余代码.........// for disable google pop-up location alerts begintry{ActivityInfo aInfo = mTaskSupervisor.resolveActivity(intent, resolvedType,startFlags, profilerInfo, userId, Binder.getCallingUid());Log.d(TAG, "callingPackage = " + callingPackage);//Log.d(TAG, "aInfo.taskAffinity = " + aInfo.taskAffinity);if (GOOGLE_PACKAGE.equals(callingPackage) && GOOGLE_LOCATION_ACTIVITY.equals(aInfo.taskAffinity))) {Log.d(TAG, "Block Google location pop-ups");return ActivityManager.START_CANCELED;}}catch(Exception e){Log.d(TAG, "e.getMessage = " + e.getMessage());}// for disable google pop-up location alerts enduserId = getActivityStartController().checkTargetUser(userId, validateIncomingUser,Binder.getCallingPid(), Binder.getCallingUid(), "startActivityAsUser");//........省略多余代码.........
}

方案二:在Dialog.show()方法中直接对这个包名所创建的Dialog做限制

  在上述第一个方案之前,我一开始遇到这个问题,脑海里直接想的是在Dialog.show()方法中里面去做拦截(因为弹窗本身就是一个Dialog)。我确实也尝试了,下面是我修改的代码。
但是后来我发现这样修改后,我思考了一下,会存在两个问题,例如:

  1.在Dialog中只能通过包名去拦截,不能直接拦截某一个指定的弹窗(或者说是Activity)。拦截一个和拦截这个包名中的全部来源,在本质上还是有区别的。

  2.虽然这种方式可以达到拦截Dialog弹窗的目的,但是依旧还是会走Activity的创建流程。既然弹窗都屏蔽掉了,那这样会有什么影响呢?
因为我项目中的业务是在某个应用的使用过程中不想要出现这个提示框,那么我就要获取到当前顶层运行的应用和Activity,实际获取到的还是这个弹窗的包名和Activity,因为虽然屏蔽掉了Dialog,但是它依然走的是Activity的启动流程,所以这种方式并不周全。

system/frameworks/base/core/java/android/app/Dialog.java
private final String GOOGLE_PACKAGE = "com.google.android.gms";public void show() {//........省略多余代码.........onStart();mDecor = mWindow.getDecorView();// for disable google pop-up location alerts beginLog.d(TAG, "mContext.getPackageName() = " + mContext.getPackageName());if(GOOGLE_PACKAGE_NAME.equals(mContext.getPackageName())) { Log.d(TAG, "Disable Google location pop-ups");return;}// for disable google pop-up location alerts endif (mActionBar == null && mWindow.hasFeature(Window.FEATURE_ACTION_BAR)) {final ApplicationInfo info = mContext.getApplicationInfo();mWindow.setDefaultIcon(info.icon);mWindow.setDefaultLogo(info.logo);mActionBar = new WindowDecorActionBar(this);}//........省略多余代码.........
那天,我听到了种子破土的声音,又细微又坚定。

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

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

相关文章

金荣中国模拟账户有什么用?实战演练,助力投资者稳健起步

在投资市场中,新手投资者往往面临着缺乏经验、不熟悉市场规则等问题,这些都可能导致投资者在真实交易中遭受损失。为了解决这个问题,金荣中国为投资者提供了一个模拟账户,那么金荣中国模拟账户有什么用?功能旨在通过实…

【经典面试题】Vue3和Vue2有什么区别?

在这篇博客中,我们将深入探讨 Vue 2 和 Vue 3 之间的主要差异,并通过示例代码来展示这些差异。 1. 架构变化 Vue 3 引入了一种新的内部架构,使用 Proxy 替代了 Vue 2 中的 Object.defineProperty。这个变化带来了性能的提升和更好的内存管理…

数组中的区别与例外

数组名可以表示整个数组,取出的是整个数组的地址 有两个例外: 1.sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小,单位是字节。 2.&数组名,数组名能表示首元…

大数据分析与应用实验(黑龙江大学)

实验一 Hadoop伪分布式实验环境搭建与WordCount程序 一、实验目的 1、学习搭建Hadoop伪分布式实验环境 2、在伪分布式实验环境下运行WordCount程序 二、实验内容 1、搭建Hadoop伪分布式实验环境,并安装Eclipse。 2、在Eclipse环境下,编写并执行Wor…

JAVA 每日面试题(一)

Java 高级面试问题及答案 以下是几个常见的Java高级面试问题,以及对应的答案。 1. 解释Java中的强引用、软引用、弱引用和虚引用的区别? 答案: 强引用(Strong Reference):如果一个对象具有强引用&#…

ros导航框架-代价地图

1、Costmap2DROS Costmap2DROS是代价地图与其他ROS模块的接口类,move_base中使用的代价地图就是Costmap2DROS对象。 Costmap2DROS负责对代价地图进行更新,以及发布代价地图,我们在rviz上看到的代价地图就是在这个类中进行发布的。 Costmap2D…

LLM - 大语言模型(LLM) 的 评估体系

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/138160155 大语言模型(LLM)的评估是复杂且多维的过程,涉及多个方面,包括评估体系、评估方法、评估实践。评估体系包括评估数据集、模型输出、样本/输出变换…

头条系统-01-环境搭建、SpringCloud微服务(注册发现、服务调用、网关)

文章目录 环境搭建、SpringCloud微服务(注册发现、服务调用、网关)1)项目介绍2)项目概述2.1)学习到的技术内容2.2)项目课程大纲2.3)项目概述2.4)项目术语2.5)业务说明 3)技术栈4)nacos环境搭建4.1)虚拟机镜像准备注: 4.2)nacos安装 5)初始工程搭建5.1)环境准备连接G…

工业相机分类

工业相机分类 按芯片类型CCD(电荷耦合器件)相机CMOS(互补金属氧化物半导体)相机按传感器结构特征线阵相机面阵相机按扫描方式隔行扫描逐行扫描按分辨率大小普通分辨率高分辨率按输出信号模拟相机数字相机按输出色彩黑白相机彩色相机按输出数据速度普通高速相机高速相机按响应频…

org.yaml.snakeyaml.scanner.ScannerException: while scanning a simple key 。。。

控制台信息: 这个信息一般是yml文件配置出现了问题,如 出现非法数据 、缩进有问题等 问题地方如下,修改一下就好了 控制台一般报的这种错就是配置文件的格式不正确

【 深度可分离卷积】

深度可分离卷积 深度可分离卷积(Depthwise Separable Convolution)是一种在卷积神经网络中减少计算量和参数数量的技术。这种技术将标准的卷积操作分解为两个更简单的操作:逐通道卷积(Depthwise Convolution)和逐点卷…

C++初阶-----对运算符重载的进一步理解(2)

目录 1.对于加加,减减运算符的重载理解 2.const修饰的一些事情 3.日期对象之间的减法实现逻辑 1.对于加加,减减运算符的重载理解 (1)在C语言里面,我们已经知道并且了解加加,减减的一些基本的用法&#…

QT学习之QFileDialog

打开一个文件夹 m_dirXML QFileDialog::getExistingDirectory(this, tr("打开XML所在文件夹"), "D:/", QFileDialog::ShowDirsOnly|QFileDialog::DontResolveSymlinks); ui.xmlDri->setText(m_dirXML);选择一个文件: scriptPath QFileDia…

【软件开发规范篇】JAVA后端开发编码命名规范

作者介绍:本人笔名姑苏老陈,从事JAVA开发工作十多年了,带过大学刚毕业的实习生,也带过技术团队。最近有个朋友的表弟,马上要大学毕业了,想从事JAVA开发工作,但不知道从何处入手。于是&#xff0…

HTML+CSS:构建网站不可不知的18个模块!

你好,我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端的程序媛。 云桃桃-大专生,一枚程序媛,感谢关注。回复 “前端基础题”,可免费获得前端基础 100 题汇总,回复 “前端工具”,可获取 Web 开发工具…

【python】调整图像大小_自定义调整、等高宽调整

【python】调整图像大小_自定义调整、等高宽调整 【先赞后看养成习惯】求点赞+关注+收藏😀 文章目录 【python】调整图像大小_自定义调整、等高宽调整1、安装 Pillow 库:2、加载图像:3、使用 resize 方法调整图像大小:4、保持图像宽高比:5、保存调整大小后的图像:在Py…

virtualbox 网络设置实现主机和虚拟机互相访问

前言 一般来说,virtualbox 虚拟机的上网模式是 NAT。这样虚拟机可以上网并访问宿主机,但宿主机无法访问虚拟机,也无法 ping 通。下面介绍双网卡模式,实现虚拟机和宿主机能够互相访问 ping 通。 双网卡模式 进入虚拟机的网络设置…

贪心算法在找零问题中的应用

贪心算法在找零问题中的应用 引言a. 贪心算法求解找零问题算法设计算法证明 b. 硬币面额为c的幂时的贪心算法证明算法设计算法证明 c. 设计使贪心算法失效的硬币面额组合d. 通用找零算法设计算法设计算法实现(伪代码)算法实现(C代码&#xff…

基于SpringBoot和PostGIS的各省与地级市空间距离分析

目录 前言 一、PostGIS时空库 1、时空表设计 2、空间数据管理与查询 二、后台接口设计 1、ORM层设计与实现 2、业务层设计与实现 3、控制层设计 三、web可视化设计与实现 1、省份范围展示 2、城市距离可视化 3、成果展示 总结 前言 在上一篇博客中基于Java和GDAL实…

光伏电站信息化管理系统有哪些?

随着科学技术的进步,信息化管理系统在企业中得到广泛应用,光伏企业亦是如此,标志着光伏企业的管理现代化水平和信息化水平。光伏电站信息化管理系统有哪些? 一、鹧鸪云光伏业务管理专家 是一款覆盖光伏项目全流程的管理平台&…