Android frameworks base下拦截某个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水平一般般,自己修改的问题,做个手记,如果对朋友们有参考价值,倍感欣慰。

Android frameworks base下拦截某个Activity启动_第1张图片

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

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

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

你可能感兴趣的:(Android,方法)