Pich Blog

关注移动开发,大数据,云计算,软件架构!

13.使用Binder连接池解决创建过多的Service

概述

AIDL是最常用的进程间通信方式。

大致使用流程:先创建一个service和一个AIDL接口,然后创建一个类继承自AIDL接口中的Stub类并实现Stub中的抽象方法,在service的onBinder的方法中返回这个类的对象,然后客户端绑定这个service,就可以拿到binder,然后调用服务端的方法了。

但是假如我们项目需要10个AIDL进行通信,那就需要创建10个service,而service就是一种系统资源,多了肯定不行。

解决思路

将所有的AIDL放到同一个service中管理。

大概工作流程:每个业务模块单独实现自己的AIDL接口。对于服务端只需要提供一个queryBinder方法,然后根据不同的业务Code来返回不懂的AIDL接口实现。如下图:

接下来模拟两个这样一个过程。同一个service管理两个AIDL接口。

创建两个业务AIDL接口

接下来创建连个AIDL接口

这个接口提供计算服务。

这个接口提供加密与解密。

实现两个业务接口

将这两个接口实现为单独的文件。

实现Binder连接池

接下来就还需要创建一个Binder接口,提供一个queryBinder方法,外部好通过该方法拿到需要的Binder。

创建IBinderPool接口

实现BinderPool接口

接下来在BinderPool类中实现该接口

实现AIDL的service

接口下来我们就需要创建一个service,然后并实现

配置service

可以看到我们在service的实现就很简单了,只需返回BinderPoolImpl的实现了。

实现BinderPool

首先BinderPool是一个单例,在创建该类的时候我们bind了AIDL的服务,并在实现了自动重连。完整代码

使用现场

这里我们需要在子线程调用,因为我们在服务端我们使用了CountDownLatch将绑定service转换为了同步过程。这样做的好处是,主要该方法调用成功,说明连接服务端成功。

可以看到采用这种方式,我将所有的AIDL都放到了一个service中,这样大大减少了系统资源的暂用。

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注