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

news/2024/5/15 15:16:39

文章目录

    • 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.mrgr.cn/p/82185704

相关文章

Markdown文件上传到博客图片处理

Markdown文件上传到博客图片处理 使用Dotnet-cnblog工具可以配合typora实现自动上传md文件里图片到博客园的图床,这样就不用自己一张张来上传 Dotnet-cnblog安装使用 1.配置NET环境 net环境下载地址:https://dotnet.microsoft.com/zh-cn/download/dotnet/5.0 下载后安装NET环…

忘记不再是问题:MySQL关键知识点速查

文章目录 MySQL备忘录内容连接MYSQL创建和展示数据库创建表修改表查询聚合与分组插入数据更新数据删除数据类型强制转换 更多内容 MySQL备忘录 做项目时,可能需要快速获取MySQL的使用方法,比如语法规则和函数用法。这正是备忘单的用途。 这里总结了一份…

ZCMU-1129

数学公式题罢了 学长1.斯特灵公式: 2.对数公式(因为以10为底,得到的是10^x,所以最后向下取整加上1);#include<cstdio> #include<cmath> using namespace std; const double PI=acos(-1); const double e=exp(double(1)); int str(int n){return floor(log10(s…

C#实现TFTP客户端

1、文件结构 2、TftpConfig.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace TftpTest {public class TftpConfig{}/// <summary>/// 模式/// </summary>public enum Modes{…

BLE --- 直接测试模式(可测天线性能)

认识BLE协议栈 —— 直接测试模式 BLE协议充分考虑了设备的测试问题,在协议栈层面提供了直接测试模式,用于执行BLE设备的RF物理层一致性的测试。 直接测试模式(Direct Test Mode)常简称为DTM。 DTM测试的核心工作是令设备在指定的频率上发送一段数据序列,在另一端使用测试…

电力能源箱3D可视化:开启智慧能源管理新篇章

随着科技的不断进步&#xff0c;电力能源箱的管理与维护逐渐向着智能化、可视化的方向发展。3D可视化技术的崛起&#xff0c;不仅极大地提升了能源管理的效率&#xff0c;更以其直观、生动的特点&#xff0c;引领着电力能源管理领域迈入了一个全新的时代。 电力能源箱作为电力系…

全景剖析阿里云容器网络数据链路(七):Terway DataPath V2(Terway≥1.8.0)

全景剖析阿里云容器网络数据链路(七):Terway DataPath V2(Terway≥1.8.0)作者:余凯 前言 近几年,企业基础设施云原生化的趋势越来越强烈,从最开始的IaaS化到现在的微服务化,客户的颗粒度精细化和可观测性的需求更加强烈。容器网络为了满足客户更高性能和更高的密度,也…

httpClient提交报文中文乱码

httpClient提交中文乱码&#xff0c;ContentType类型application/json 指定提交参数的编码即可 StringEntity se new StringEntity(paramBody.toJSONString(),"UTF-8");se.setContentType("application/json");context.httpPost.setHeader("Cookie&…

[转载] RPATH/LD_LIBRARY_PATH/RUNPATH

原文地址: https://zhuanlan.zhihu.com/p/534778561 rpath和runpath都是用来指定搜索动态链接库的目录的,如果不清楚动态链接库是什么,可见静态库vs动态库。 动态链接库(shared libraries)作为库并不像静态库一样和可执行文件绑定,而是在运行时加载。但,可执行文件在运行…

mybatis的使用技巧9——mysql按年、季度、月、周等不同时间维度查询或分组统计

在实际项目开发过程中&#xff0c;按不同时间维度查询业务数据的操作异常频繁。比较多的操作如支持按时间周期范围做列表数据的筛选&#xff0c;或者是按年月日等维度的图表展示&#xff0c;亦或者是首页的概况&#xff0c;三维大屏的展示等&#xff0c;都离不开不同时间周期查…

在vue2中,什么是双向绑定,为什么vue3要进行优化?

一、什么是双向绑定 我们先从单向绑定切入单向绑定非常简单,就是把Model绑定到View,当我们用JavaScript代码更新Model时,View就会自动更新双向绑定就很容易联想到了,在单向绑定的基础上,用户更新了View,Model的数据也自动被更新了,这种情况就是双向绑定举个栗子 当用户填…

unocss如何使用css变量

在 UnoCSS 中,可以直接使用 CSS 变量来定义样式。但是,UnoCSS 本身并不支持直接使用变量名作为类名或选择器。 如果想使用 CSS 变量来定义样式,可以按照以下方式进行操作: 在 CSS 文件中定义一个变量,例如 --text-color: red;。 在 UnoCSS 的样式表中,可以通过 var() 函数…

Linux手动安装JD详细教程

1、手动安装1.1 卸载OpenJDK以及相关的Java文件 1.2 安装JDK1. 新建一个存放安装包的文件夹 2. 将下载的安装包传到该文件夹 3. 解压安装包 4. 修改配置文件/etc/profile,配置环境变量 5. 重新加载配置 6. 查看安装情况JDK下载 1、下载JDK 下载网址:https://www.oracle.com/t…

2024 java使用Graceful Response,告别自己去封装响应,可以接收数据异常,快看我这一篇,足够你用!

参考官网手册地址&#xff1a;快速入门 | Docs 一、导入依赖&#xff08;根据springboot查看对应依赖版本&#xff09; <!-- Graceful --><dependency><groupId>com.feiniaojin</groupId><artifactId>graceful-response</artifactId&g…

关于零长度数组的思考

首先看一下以下的结构声明 struct Packet {int cmd;int len;char body[0]; };可以看到body被声明为一个长度为0的字符数组。经过测试,sizeof(Packet)的值为8,也就是说body实际上并没有分配内存。这种数组被称作零长度数组(Arrays of Length Zero)或者柔性数组,其中char bo…

2024第十五届蓝桥杯网络安全赛项部分题目 WriteUp

2024第十五届蓝桥杯网络安全赛项部分题目 WriteUp2024第十五届蓝桥杯网络安全赛项部分题目 WriteUp 爬虫协议 根据提示,访问/robots.txt,得到敏感路径 /38063b612387b10e22f4bd0d71a46a4e/,访问其中的/9de33df789dc91e984a091e6dce2dfb1得到flag。 flag{494547b4-f13f-47de-…

利用GaussDB的可观测性能力构建故障模型

D-SMART高斯专版已经开发了几个月了&#xff0c;目前主要技术问题都已经解决&#xff0c;也能够初步看到大概的面貌了。有朋友问我&#xff0c;GaussDB不已经有了TPOPS了&#xff0c;为什么你们还要开发D-SMART高斯专版呢&#xff1f; 实际上TPOPS和D-SMART虽然都可以用于Gaus…

Linux内核源码-存储驱动之 QSPI Flash

传输方式 DIO/QIO/DOUT/QPIQPI模式(Quad Peripheral Interface),所有阶段都通过4线传输。与之相对的是SPI。 SPI模式:纯种SPI(MISO/MOSI两个数据线) DOUT 全称 Dual I/O,命令字和地址字均为单线,仅在数据阶段为双线。 QOUT 全称 Quad I/O,命令字和地址字均为单线,仅在数据…

求极限的方法总结

求极限的方法总结 两个重要极限: \(\Large \underset{x\rightarrow 0}{\lim}\frac{\sin x}{x} = 1\) \(\Large \underset{x\rightarrow \infty}{\lim}(1+\frac{1}{x})^x=e\) 1. 直接代入 函数在某点连续,函数在该点的极限等于该点的函数值 一切初等函数在其定义区间内都是连续…

VPN的基本概念

随着互联网的普及和应用的广泛&#xff0c;网络安全和隐私保护越来越受到人们的关注。在这个信息爆炸的时代&#xff0c;我们的个人信息、数据通信可能会受到各种威胁&#xff0c;如何保护自己的隐私和数据安全成为了一个迫切的问题。而VPN&#xff08;Virtual Private Network…