三、动态代理类
该类持有 mIActivityManager 接口对象 , 当检测到调用 startActivity 方法时 , 拦截该方法 , 在该 startActivity 方法中替换方法中的 Intent 参数 ;
package kim.hsl.plugin; import android.content.Context; import android.content.Intent; import android.util.Log; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; /** * 动态代理的代理类 */ public class AmsInvocationHandler implements InvocationHandler { /** * 上下文对象 */ private final Context mContext; /** * 持有被代理的原对象 */ private final Object mIActivityManager; public AmsInvocationHandler(Context context, Object iActivityManager) { this.mContext = context; this.mIActivityManager = iActivityManager; } /** * 代理 IActivityManager 的 startActivity 方法 * 替换要启动的 Activity 的 Intent * * @param proxy * @param method * @param args * @return * @throws Throwable */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // 检测到方法名称是 startActivity // 要使用自己的方法 , 替换被代理的方法 // 主要进行替换要启动的 Activity 的 Intent 操作 if("startActivity".equals(method.getName())){ Intent intent = null; // Intent 会通过参数传入 // 遍历方法的参数即可 for (int i= 0; i < args.length; i++){ // 获取参数对象 Object arg = args[i]; // 方法参数类型是 Intent if(arg instanceof Intent){ // 将原来的传入的 Intent 参数 , 改成自己的 Intent , 启动自己的类 intent = (Intent) arg; // 新的 Intent , 用于替换原有的 Intent Intent exchangeIntent = new Intent(mContext, StubActivity.class); // 原来的 Intent 不能丢 , 里面包含了很多信息 , 如实际的跳转信息 // 最终还要替换回去 exchangeIntent.putExtra("actionIntent", intent); // 替换原来的 Intent 参数值 args[i] = exchangeIntent; break; } } } // 继续向后执行 , 这里要避免截断方法 return method.invoke(mIActivityManager, args); } }
四、使用动态代理替换 IActivityManagerSingleton 的 mInstance 成员
1、通过反射获取 IActivityManagerInterface 接口
IActivityManager 是接口 , 这是一个 AIDL 文件生成的 , 由 IActivityManager.aidl 生成 ;
通过反射获取 android.app.IActivityManager 接口 ;
// IActivityManager 是接口 // 这是一个 AIDL 文件生成的 , 由 IActivityManager.aidl 生成 Class<?> IActivityManagerInterface = null; try { IActivityManagerInterface = Class.forName("android.app.IActivityManager"); } catch (ClassNotFoundException e) { e.printStackTrace(); }
2、动态代理
创建 InvocationHandler 对象 ;
然后创建动态代理对象 ;
// 动态代理的实际代理类 AmsInvocationHandler amsInvocationHandler = new AmsInvocationHandler(context, mInstanceObject); // 动态代理过程 Object proxy = Proxy.newProxyInstance( Thread.currentThread().getContextClassLoader(), // 类加载器 new Class[]{IActivityManagerInterface}, // 接口 amsInvocationHandler); // 代理的对象