隨著項(xiàng)目的逐漸增大疤祭,主進(jìn)程越來(lái)越大湾揽,而WebView占用太多的內(nèi)存旅挤,不得不將其放到獨(dú)立進(jìn)程中踢关,于是就要處理多進(jìn)程通信問(wèn)題。
項(xiàng)目結(jié)構(gòu)
1)主進(jìn)程
2)remoteWeb進(jìn)程
3)Binder連接池
4)URLRouter自定義協(xié)議分析工具
今天主要說(shuō)下Binder連接池粘茄。其實(shí)我覺(jué)得這種方式適合大型签舞,多服務(wù)型的客戶端,像我們項(xiàng)目中用這種方式顯得有點(diǎn)多余和裝逼柒瓣。直接上代碼吧儒搭。
項(xiàng)目中只有一個(gè)web進(jìn)程,因此定義一個(gè)web進(jìn)程通信接口IWebActions.aidl:
下面是其實(shí)現(xiàn)類:
現(xiàn)在業(yè)務(wù)模塊的AIDL已經(jīng)實(shí)現(xiàn)了芙贫,接下來(lái)就是服務(wù)端和Binder連接池的事情搂鲫。
首先為Binder連接池創(chuàng)建AIDL接口IBinderPool.aidl:
然后實(shí)現(xiàn)IBinderPool:
創(chuàng)建Service:
以上所有接口、service都運(yùn)行在主進(jìn)程磺平,這樣可以保證所有遠(yuǎn)端進(jìn)程通過(guò)Binder連接池綁定BinderPoolService時(shí)魂仍,BinderPoolService只初始化一次,保證整個(gè)項(xiàng)目只有一個(gè)service對(duì)象在運(yùn)行拣挪。
Binder連接池BinderPool的定義:
BinderPool在調(diào)用queryBinder()時(shí)需要在自定義線程中擦酌,因?yàn)镾ervice的綁定是耗時(shí)的,同步的媒吗。這樣Binder連接池就定義好了仑氛。這樣做有幾個(gè)好處
1:不需要針對(duì)每種業(yè)務(wù)定義單獨(dú)的Service。只需要定義BinderPoolService即可
2:BinderPoolService運(yùn)行在主進(jìn)程闸英,保證只會(huì)被創(chuàng)建一次
3:BinderPool是單例的锯岖,這樣可以保證在同一個(gè)進(jìn)程中BinderPool只初始化一次,服務(wù)的綁定只發(fā)生一次
4:如果要添加或刪除一個(gè)進(jìn)程通信接口也很容易甫何,只需要在BinderPoolImpl中根據(jù)binderCode添加或刪除對(duì)應(yīng)的進(jìn)程通信接口就可以了
項(xiàng)目鏈接:demo