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 begin
    ActivityInfo aInfo = mTaskSupervisor.resolveActivity(intent, resolvedType,
            startFlags, profilerInfo, userId, Binder.getCallingUid());
    Log.d(TAG, "callingPackage = " + callingPackage);
    Log.d(TAG, "aInfo.taskAffinity = " + aInfo.taskAffinity);
    Log.d(TAG, "getCurrentApp() = " + getCurrentApp());
    if (GOOGLE_PACKAGE.equals(callingPackage) && GOOGLE_LOCATION_ACTIVITY.equals(aInfo.taskAffinity))) {
        Log.d(TAG, "Block Google location pop-ups");
        return ActivityManager.START_CANCELED;
    }
    // for disable google pop-up location alerts end


    userId = getActivityStartController().checkTargetUser(userId, validateIncomingUser,
            Binder.getCallingPid(), Binder.getCallingUid(), "startActivityAsUser");
            
//........省略多余代码.........
}

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

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

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

2.虽然这种方式可以达到拦截Dialog弹窗的目的,但是依旧还是会走Activity的创建流程。既然弹窗都屏蔽掉了,那这样会有什么影响呢?
因为我项目中的业务是在某个应用的使用过程中不想要出现这个提示框,那么我就要获取到当前顶层运行的应用和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 begin
    Log.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 end
    
    if (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.mfbz.cn/a/574564.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

报错:OpenGL.error.NullFunctionError: Attempt to call an undefined function”

文件我已经上传 CSDN默认就是收费的 我修改不了 免费链接在文中 请寻找 OpenGL.error.NullFunctionError: Attempt to call an undefined function” 环境陈述: windows11 AMD-R9 python版本3.9.9 背景: 通过pip安装pip install PyOpenGL安装PyOpenGL模块后 运行出现的问题…

NLP Step by Step -- How to use pipeline

正如我们在摸鱼有一手:NLP step by step -- 了解Transformer中看到的那样,Transformers模型通常非常大。对于数以百万计到数千万计数十亿的参数,训练和部署这些模型是一项复杂的任务。此外,由于几乎每天都在发布新模型&#xff0c…

数据挖掘实验一

一、实验环境及背景 使用软件: Anaconda3 Jupyter Notebook 实验内容: 1.使用Tushare或者其他手段获取任意两支股票近三个月的交易数据。做出收盘价的变动图像。2.使用Pandas_datareader获取世界银行数据库中美国(USA)、瑞典&…

Windows电脑中护眼(夜间)模式的开启异常

我的电脑是联想小新16pro,Windows11版本。之前一直可以正常使用夜间模式,但是经过一次电脑的版本更新之后,我重启电脑发现我的夜间模式不能使用了。明明显示开启状态,但是却不能使用,电脑还是无法显示夜间模式。 询问…

基于Spring Boot的考研资讯平台设计与实现

基于Spring Boot的考研资讯平台设计与实现 开发语言:Java框架:springbootJDK版本:JDK1.8数据库工具:Navicat11开发软件:eclipse/myeclipse/idea 系统部分展示 系统功能界面图,在系统首页可以查看首页、考…

【Qt QML】TabBar的用法

Qt Quick中的TabBar提供了一个基于选项卡的导航模型。TabBar由TabButton控件填充,并且可以与任何提供currentIndex属性的布局或容器控件一起使用,例如StackLayout或SwipeView。 import QtQuick import QtQuick.Controls import QtQuick.LayoutsWindow …

FPGA实现AXI4总线的读写_如何写axi4逻辑

FPGA实现AXI4总线的读写_如何写axi4逻辑 一、AXI4 接口描述 通道信号源信号描述全局信号aclk主机全局时钟aresetn主机全局复位,低有效写通道地址与控制信号通道M_AXI_WR_awid[3:0]主机写地址ID,用来标志一组写信号M_AXI_WR_awaddr[31:0]主机写地址&…

贪吃蛇身子改进加贪吃蛇向右移动

1. 蛇移动的思想: 其实就是删除头节点 ,增加尾节点;一句代码搞定 struct Snake *p; p head; head head -> next; free(p) 防止造成多的空间节点 2.增加尾节点代码思想: 2.1 .开辟new 节点的空间 struct Snake *new (stru…

每日OJ题_DFS回溯剪枝①_力扣46. 全排列(回溯算法简介)

目录 回溯算法简介 力扣46. 全排列 解析代码 回溯算法简介 回溯算法是一种经典的递归算法,通常⽤于解决组合问题、排列问题和搜索问题等。 回溯算法的基本思想:从一个初始状态开始,按照⼀定的规则向前搜索,当搜索到某个状态无…

Quarto Dashboards 教程 3:Dashboard Data Display

「写在前面」 学习一个软件最好的方法就是啃它的官方文档。本着自己学习、分享他人的态度,分享官方文档的中文教程。软件可能随时更新,建议配合官方文档一起阅读。推荐先按顺序阅读往期内容: 1.quarto 教程 1:Hello, Quarto 2.qu…

耐酸碱腐蚀PFA冷凝回流装置进口透明聚四氟材质PFA梨形漏斗特氟龙圆底烧瓶

PFA分液漏斗:也叫特氟龙分液漏斗、特氟龙梨型分液漏斗。 规格参考:125ml、250ml、500ml、1000ml 其主要特性有: 1.内壁对溶剂无粘贴性和吸附,可完全排空,分界面清晰可见; 2.密封性好,可防止…

excel文件导入dbeaver中文乱码

1.将excel文件进行另存为,保存类型选择【CSV】 2.选择【工具】–>【web选项】–> 【编码】–> 【简体中文(GB18030)】 3.在DBeaver进行数据导入 直接导入应该就可以,如果不行的话按下面处理。 选择【导入数据——选择cs…

云原生Kubernetes: K8S 1.29版本 部署Nexus

目录 一、实验 1.环境 2.搭建NFS 3. K8S 1.29版本 部署Nexus 二、问题 1.volumeMode有哪几种模式 一、实验 1.环境 (1)主机 表1 主机 主机架构版本IP备注masterK8S master节点1.29.0192.168.204.8 node1K8S node节点1.29.0192.168.204.9node2K…

Java毕业设计 基于SpringBoot vue养老院管理系统 微信小程序

Java毕业设计 基于SpringBoot vue养老院管理系统 微信小程序 SpringBoot 养老院管理系统 功能介绍 小程序 护工登录注册 忘记密码 护工信息维护 首页 图片轮播 床位调动申请 床位展示 床位详情 床位分配 房间展示 公告信息 公告详情 健康信息 请假申请 离职申请 后台管理 登…

09.JAVAEE之网络初识

1.网络 单机时代 >局域网时代 >广域网时代 >移动互联网时代 1.1 局域网LAN 局域网,即 Local Area Network,简称LAN。 Local 即标识了局域网是本地,局部组建的一种私有网络。 局域网内的主机之间能方便的进行网络通信&#xff0…

有哪些人工智能/数据分析领域可以考取的证书?

一、TensorFlow谷歌开发者认证 TensorFlow面向学生、开发者、数据科学家等人群,帮助他们展示自己在用 TensorFlow 构建、训练模型的过程中所学到的实用机器学习技能。 添加图片注释,不超过 140 字(可选) TensorFlow 的产品总监 …

抖音智能运营系统源码

这是一个一站式服务的抖音智能运营系统,旨在提升内容创作者和营销人员的工作效率。它是一个综合性的在线服务平台,专为抖音内容创作者和营销人员设计。系统基于高性能、可扩展性强的ThinkPHP框架,整合了视频处理、数据分析、文案生成与配音等…

Redis网络部分相关的结构体2 和 绑定回调函数细节

目录 1. struct connection ConnectionType属性 创建connection 2. struct client 3. 绑定客户端回调函数的流程 3.1. 读事件回调函数的设置 3.2. 写事件回调函数的设置 3.3. connSocketEventHandler函数 3.4. Redis5版本的设置回调函数 3.5. 个人的一些想法&#xf…

2024贵州康博会|特色健康食品展|医药展|医疗器械展会

2024 中国(贵州)大健康产业博览会2024 特色食品(农产品、水、饮料)暨第22届医药及医疗器械、设备展览会邀请函 时间:2024 年 9 月 26 日 -28 日(共三天) 地点:贵阳国际会议展览中心 (观山湖区) 主办单位: 贵州省天然饮用水行业协会 贵州省大健康产业…

diskMirror docker 使用容器部署 diskMirror 服务器!!!

Welcome to diskMirror-docker 获取项目 这个项目是 diskMirror-spring-boot 镜像版本的项目,您可以使用下面的命令将此项目编译为一个镜像! # 进入到您下载的源码包目录 cd diskMirror-docker# 点击脚本来进行版本的设置以及对应版本的下载 设置 和 编…
最新文章