Binder连接池在WebView独立进程中的应用

随着项目的逐渐增大,主进程越来越大,而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

你可能感兴趣的:(Binder连接池在WebView独立进程中的应用)