原理:
context.startActivity跳转间接使用Instrumentation对象execStartActivity方法,而Instrumentation存在于ActivityThread中,有趣的是在应用启动后,有且只有一个ActivityThread对象,那么Instrumentation也只有一个,也就是说不管哪个Context使用startActivity方法都是间接使用同一个Instrumentation对象。既然要过滤startActivity请求,那么可以通过替换原来的Instrumentation来达到我们的目的。这里使用代理模式,在做具体实现之前,先执行我们设定的动作(过滤)。
注:如果使用JDK自带的代理处理模块,在Android上不能运行,因为Android使用的Dalvik字节码,而不是java字节码,需要使用第三方库dexmaker。
1、实现代理接口
作用:在执行execStartActivity方法前先过滤。
2、替换Instrumentation
作用:自定义Instrumentation功能