参考自:
https://blog.csdn.net/sunyao19940708/article/details/80021252?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase
直接加到application中,oncreate中()调用
private void hook() {
try {
// 还原 gDefault() 成员
Class activityManagerNative = Class.forName("android.app.ActivityManagerNative");
// 获取到成员变量
Field gDefault = activityManagerNative.getDeclaredField("gDefault");
gDefault.setAccessible(true);
// 获取类成员变量,直接传空,因为是静态变量,所以获取到的是系统值,
// 得到Singleton 静态类,
Object defaultValue = gDefault.get(null);
//mInstance对象
Class<?> singletonClass=Class.forName("android.util.Singleton");
Field mInstance = singletonClass.getDeclaredField("mInstance");
mInstance.setAccessible(true);
// 获取到成员变量
Object iActivityManagerObject = mInstance.get(defaultValue);
// 实现该接口
Class iActivityManagerIntercept = Class.forName("android.app.IActivityManager");
StartActivity startActivity = new StartActivity(iActivityManagerObject);
/**
* ClassLoader loader 当前的类加载器
* Class<?>[] interfaces 返回的类将会实现的接口
* InvocationHandler h 实现了InvocationHandler 接口的代理类,以便实现系统分发出来的方法,实现拦截操作
*/
Object oldIActivityManager = Proxy.newProxyInstance(
Thread.currentThread().getContextClassLoader(),
new Class[]{iActivityManagerIntercept},
startActivity
);
// 将我们获取到的值设置进去
mInstance.set(defaultValue, oldIActivityManager);
} catch (Exception e) {
e.printStackTrace();
}
}
新建startActyivity类
package com.mouxiugas.xian;
import android.content.Intent;
import android.util.Log;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
* @user XUNUA
* @email xunua@outlook.com
* @creat time 2020/7/22 10:00
*/
class StartActivity implements InvocationHandler {
private Object iActivityManager;
public StartActivity(Object iActivityManager) {
this.iActivityManager = iActivityManager;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if ("startActivity".equals(method.getName())) {
final Intent intent = (Intent) args[2];
if (intent != null) {
if ("android.intent.action.VIEW".equals(intent.getAction())){
final String s = intent.getData().toString();
Log.d("Ellison", "---------startActivity----------"+ s);
//这里判断s是不是我们要拦截跳转的url
if (s.equals("https://hydrozoa.felisworks.com/")|| s.equals("http://silversecond.com/")|| s.equals("https://hydrozoa.felisworks.com/")){
//是的话,那么就使这两个参数 iActivityManager args为空 这样就不会执行跳转
//也可以去掉if语句,那样的话就是拦截所有的打开浏览器请求
iActivityManager=null;args=null;
}
}
}
}
return method.invoke(iActivityManager, args);
}
}