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

devtools/2024/10/9 15:23:39/

文章目录

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

AndroidAMSActivity_1">AndroidAMS中拦截某个具体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.ppmy.cn/devtools/23068.html

相关文章

[Algorithm][分治 - 归并排序][排序数组][交易逆序对的总数][计算右侧小于当前元素的个数][翻转对]详细讲解

目录 0.原理讲解1.排序数组1.题目链接2.代码实现 2.交易逆序对的总数1.题目链接2.算法原理详解3.代码实现 3.计算右侧小于当前元素的个数1.题目链接2.算法原理详解3.代码实现 4.翻转对1.题目链接2.算法原理详解3.代码实现 0.原理讲解 归并排序的流程充分的体现了**「分⽽治之」…

C++:map和set的封装

关于红黑树的模拟实现,大家不清楚的先去看看博主的博客再来看这篇文章,因为set和map的封装底层都是利用用的红黑树。所以这里不会过多介绍红黑树的相关内容,而更多的是去为了契合STL中的红黑树去进行改造,让封装的set和map能够去复…

杰发科技AC7840——CAN通信简介(7)_波形分析

参考: CAN总线协议_stm32_mustfeng-GitCode 开源社区 0. 简介 隐形和显性波形 整帧数据表示 1. 字节描述 CAN数据帧标准格式域段域段名位宽:bit描述帧起始SOF(Start Of Frame)1数据帧起始标志,固定为1bit显性(b0)仲裁段dentify(ID)11本数…

基于微信小程序的旅游系统的设计与实现

基于微信小程序的旅游系统的设计与实现 Design and Implementation of a Tourism System based on WeChat Mini Program 完整下载链接:基于微信小程序的旅游系统的设计与实现 文章目录 基于微信小程序的旅游系统的设计与实现摘要第一章 绪论1.1 研究背景与意义1.2 国内外研究…

CMUS狮身人面像(六)-调整语音识别准确性

调整语音识别准确性 精度差的原因测试数据库设置运行测试 语音识别的准确性并不总是很高。 首先,重要的是要了解您的准确性是否只是低于预期,还是总体上非常低。如果总体精度非常低,则您很可能错误配置了解码器。如果低于预期,可…

前端高并发的出现场景及解决方法——技能提升——p-limit的使用

最近在写后台管理系统的时候,遇到一个场景,就是打印的页面需要根据传入的多个id,分别去请求详情接口。 比如id有10个,则需要调用10次详情接口获取到数据,最后对所有的数据进行整合后页面渲染。 相信大家或多或少都遇到…

uniapp自定义返回事件(封装)

uniapp自定义返回事件 在我们使用uniapp时,我们导航栏一般都是自定义的,比如用uview框架的导航栏,那么返回事件通常会遇到以下几个问题 返回事件前需要做一些额外的处理 h5项目刷新页面后返回失效 返回按钮点击后到指定页面 如果只是监听返…

信息系统项目管理师——第5章信息系统工程(一)

近几期的考情来看,本章选择题稳定考4分,考案例的可能性有,需要重点学习。本章节专业知识点特别多。但是,只考课本原话,大家一定要把本章至少通读一遍,还要多刷题,巩固重点知识。 1 软件工程 软…