通常情况下,每个AIDL接口对应一个Service进行进程间通信,若有多个ADIL接口,也要创建多个Service,但Service是系统资源,无限制增加的话,会占用过多内存。下面就介绍下Binder连接池,以及怎样实现一个Service管理多个ADIL接口。
Binder连接池,是将各个业务模块的Binder请求统一转发到远程Service中去执行,可避免重复创建Sevice。
1 首先提供ISecurity、IPay两个接口,用于密码校验和支付
interface ISecurity {
String encode(String psw);
String decode(String psw);
}
interface IPay {
void buy();
}
2 SecurityImpl、PayImpl是两个接口的实现
public class SecurityImpl extends ISecurity.Stub {//Stub内部类,其实就是一个Binder类
private static final String TAG = "SecurityImpl lyl123";
@Override
public String encode(String psw) throws RemoteException {
Log.e(TAG, "encode, psw = " + psw);
char[] chars = psw.toCharArray();
for (int i = 0;i < chars.length; i++){
chars[i] ^= '^';
}
return new String(chars);
}
@Override
public String decode(String psw) throws RemoteException {
Log.e(TAG, "decode: psw = " + psw);
return encode(psw);
}
}
public class PayImpl extends IPay.Stub {//Stub内部类,其实就是一个Binder类
private static final String TAG = "PayImpl lyl123";
@Override
public void buy() throws RemoteException {
Log.e(TAG, "buy something");
}
}
3 提供一个AIDL接口IBinderPool,并提供一个获取Binder的方法
interface IBinderPool {
IBinder queryBinder(int binderCode);
}
4. Binder连接池的实现