随着项目的逐渐增大,主进程越来越大,而WebView占用太多的内存,不得不将其放到独立进程中,于是就要处理多进程通信问题。
项目结构
1)主进程
2)remoteWeb进程
3)Binder连接池
4)URLRouter自定义协议分析工具
今天主要说下Binder连接池。其实我觉得这种方式适合大型,多服务型的客户端,像我们项目中用这种方式显得有点多余和装逼。直接上代码吧。
项目中只有一个web进程,因此定义一个web进程通信接口IWebActions.aidl:

下面是其实现类:

现在业务模块的AIDL已经实现了,接下来就是服务端和Binder连接池的事情。
首先为Binder连接池创建AIDL接口IBinderPool.aidl:

然后实现IBinderPool:

创建Service:

以上所有接口、service都运行在主进程,这样可以保证所有远端进程通过Binder连接池绑定BinderPoolService时,BinderPoolService只初始化一次,保证整个项目只有一个service对象在运行。
Binder连接池BinderPool的定义:


BinderPool在调用queryBinder()时需要在自定义线程中,因为Service的绑定是耗时的,同步的。这样Binder连接池就定义好了。这样做有几个好处
1:不需要针对每种业务定义单独的Service。只需要定义BinderPoolService即可
2:BinderPoolService运行在主进程,保证只会被创建一次
3:BinderPool是单例的,这样可以保证在同一个进程中BinderPool只初始化一次,服务的绑定只发生一次
4:如果要添加或删除一个进程通信接口也很容易,只需要在BinderPoolImpl中根据binderCode添加或删除对应的进程通信接口就可以了
项目链接:demo
网友评论