Android frameworks base下拦截某个Activity启动

本文介绍在TV系统中如何解决开机时预置APK弹出定位对话框的问题。通过在ActivityStackSupervisor.startActivityMayWait方法中拦截特定的PackageName和ActivityName,成功阻止了不需要的Activity启动。

最近遇到一个问题:在TV 系统中预置了一个apk,每次开机都会弹出一个提示框,关于是否打开定位的对话框,查看log是启动了一个Activity,因为是 .apk 来的,所以无法修改到源码,阻止其intent到这个Activity,所以不得不从Activity的启动过程中找解决方案。

ActivityManagerService.java

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

下面是调用流程:

  • ActivityManagerService.startActivity
  • ActivityManagerService.startActivityAsUser
  • ActivityStackSupervisor.startActivityMayWait (我是在这一步进行Activity的拦截的,因为这个方法中的参数比较明显,基本可以直接调用)
  • ActivityStackSupervisor.startActivityLocked :检查有没有在AndroidManifest中注册
  • ActivityStackSupervisor.startActivityUncheckedLocked
  • ActivityStack.startActivityLocked :判断是否需要创建一个新的任务来启动Activity。
  • ActivityStack.resumeTopActivityLocked :获取栈顶的activity,并通知Launcher应该pause掉这个Activity以便启动新的activity。
  • ActivityStack.startPausingLocked
  • ApplicationThreadProxy.schedulePauseActivity

一下是具体的几行代码,本人Android/Java水平一般般,自己修改的问题,做个手记,如果对朋友们有参考价值,倍感欣慰。

其实做法很简单,就是获取到想要拦截 PackageName 和 Activity Name,然后 return 就可以了。

解决一个问题,所用的方法并不一定有多难,有时候甚至很简单,最重要的是找准找对位置。

就如同一台机器出了问题,影响正常运转,最后查到是一颗螺丝钉坏了,换个新的就可以,难的是排查到这颗螺丝钉的过程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值