Android知识点总结(四)进程间通信
上一篇文章记录了Messenger及AIDL的使用。其中AIDL的使用是最广泛的,其大致流程:
- 首先创建一个Service和一个AIDL接口
- 接着创建一个类继承自AIDL接口中的Stub类并实现Stub中的抽象方法(也可以直接使用匿名内部类的方式实现),在Service的onBind方法中返回这个类的对象
- 然后客户端就可以绑定服务端Service,建立连接后就可以访问远程服务端的方法了。
但是如果项目业务越来越大,需要10个AIDL来进行进程间通信时,创建10个Service显然不太现实,这时就需要Binder连接池技术,该模式工作机制是这样的:
- 每个业务模块创建自己的AIDL接口
- 同时提供一个Binder池接口,提供queryBinder,这个接口能根据业务需求,返回对应的Binder对象,这样不同业务模块就能根据自己的Binder进行远程调用
- 此时只需一个Service,在其onBind方法里返回Binder池对应的Binder类,客户端就能获取不同的Binder实现所需功能。
下面写一个例子,首先建立两个AIDL接口,模拟多个业务模块的情况:
// ISecurityCenter.aidl
package com.scy.component.testlaunteractivity;
// Declare any non-default types here with import statements
interface ISecurityCenter {
String encrypt(String content);
String decrypt(String psd);
}
// ICompute.aidl
package com.scy.component.testlaunteractivity;
// Declare any non-default types here with import statements
interface ICompute {
int add(int a, int b);
}
接着创建类继承各自AIDL接口中的Stub类并实现Stub中的抽象方法:
public class SecurityCenterImpl extends ISecurityCenter.Stub{
private static final char SECRET = '*';
@Override
pub