众所周知,Java的InvocationHandler可以作为动态代理去调用接口方法。但是如何去调用android里面的aidl接口定义的方法呢?
经过查阅相关资料和自己实践最终得出解决方案:
1 首先利用反射获取aidl接口的实例
Class<?> reflectCallback = null;
try {
reflectCallback = Class.forName("com.xxx.xxx.IAidlClass"); //aidl类
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
mProxyHandler = new CallbackProxyHandler(ServiceManager.AUDIO_BOOK_KEY);
mCallbackProxy = (IAidlClass) Proxy.newProxyInstance(
CallbackProxyManager.class.getClassLoader(), new Class[] {
reflectCallback },
mProxyHandler);
2 接着去实现InvocationHandler类
public class CallbackProxyHandler implements InvocationHandler {
String key;
public CallbackProxyHandler(String key) {
this.key = key;
}
@Override
public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
boolean result = ServiceManager.getInstance().startRemoteService(key);//启动某个service,可以忽略这句
if (result) {
InvokeObject invokeObject = new InvokeObject();
invokeObject.setKey(key);
invokeObject.setMethod(method);
invokeObject.setObjects(objects);
IInterface disposeInterface = IAidlClass//这里iaidl可以通过任何方式传进来
invokeObject.getMethod().invoke(disposeInterface, invokeObject.getObjects());
return true;
}
return false;
}
}
上面的invokeObject主要存贮了被代理aidl类的相关属性和方法。
public class InvokeObject {
private String key;
private Method method;
private Object[] objects;
}
这样就完成了通过动态代理去调用aidl接口的实现了。