通往架構(gòu)師的一天 之項目架構(gòu)-webview3

? ?接上文 我們已經(jīng)實現(xiàn)了webview在項目里作為一個組件 把webview放在單獨的進(jìn)程里 同時支持webview包含在fragment 或activity里 同時添加了各種loading狀態(tài) 接下來我們要實現(xiàn)H5與android間通過? ? ?js通信

首先我們先定義BaseWebView 繼承自WebView? 然后把webview一些基本的設(shè)置放在basewebview里 實現(xiàn)封裝 添加一個register方法把fragment實現(xiàn)的webviewclient 以及WebChromeClient的監(jiān)聽設(shè)置進(jìn)去

然后繼續(xù)實現(xiàn)js與java的通信? 一般來說 我們實現(xiàn)通信的方法 都是 通過@JavascriptInterface 注解 實現(xiàn)與h5約定好的方法實現(xiàn)交互? 但這樣會有很多@JavascriptInterface方法 我們的webview實現(xiàn)在單獨的進(jìn)程? 而大部分的業(yè)務(wù)邏輯實現(xiàn)在主進(jìn)程里 所以我們用一種新的辦法

我們需要跨進(jìn)程通信 所以我們新建一個IWebToMainProcessInterface 的AIDL 里面有一個void handlerWebCommand(String commandName,String jsonParams)方法 用于進(jìn)程間通信

新建類MainProcessCommandsManager 用來接收發(fā)往主進(jìn)程的命令 這個類實現(xiàn)IWebToMainProcessInterface.Stub???方法并且實現(xiàn)單例? 新建MainProcessCommandService 在onBind方法里返回MainProcessCommandsManager的單例? 接下來 新建WebViewProcessCommandDispatcher 用來發(fā)送web的命令 這個類同時也是單例 并且有提供 initAidlConnection方法連接MainProcessCommandService 并且在BaseWebView init的時候調(diào)用連接服務(wù)?WebViewProcessCommandDispatcher 提供executeCommand 用于使用拿到的IWebToMainProcessInterface發(fā)送命令

callback是用于從主進(jìn)程回調(diào)web


?我們在只定義一個?takeNativeAction(final String jsParam) 方法? 所有與原生的交互都通過這個方法來實現(xiàn) 參數(shù)是一個json字符串? json里有一個命令名 和命令參數(shù)

方法里我們拿到WebViewProcessCommandDispatcher 單例 執(zhí)行executeCommand 方法 通過aidl 調(diào)用到?MainProcessCommandsManager 這樣我們的命令就調(diào)到了主線程

接下來我們來實現(xiàn)主線程的命令分發(fā)?

我們新建一個Command 的接口 是所有命令的父類 有name和execute兩個方法 其中name 返回命令名字?execute方法執(zhí)行命令

接下來 在MainProcessCommandsManager 的構(gòu)造方法中 通過ServiceLoader 拿到所有Command 接口的實現(xiàn)類 并且用HashMap 緩存下來?

在執(zhí)行的時候 只要根據(jù)命令名字取出對應(yīng)的?Command 對象 執(zhí)行execute方法 就實現(xiàn)了命令的分發(fā)


接下來我們來實現(xiàn)命令的回調(diào)?

首先 在js調(diào)用原生的方法的參數(shù)json里添加一個callbackName 即js的回調(diào)方法名 接下來 新建一個主進(jìn)程與web進(jìn)程通信的aidl?ICallbackMainToWebProcessInterface?

定義一個void handlerCallback(String callBackName,String response); callbackname是回調(diào)的js方法名 response是回調(diào)給js的參數(shù)

在調(diào)用WebViewProcessCommandDispatcher.getInstance().executeCommand時把實現(xiàn)ICallbackMainToWebProcessInterface.Stub() 回調(diào)傳遞給command 在具體的命令中回調(diào)給web 進(jìn)程并且

通過 js語句回調(diào)給h5 這樣就完成了快進(jìn)程的調(diào)用以及回調(diào)

詳細(xì)代碼見https://github.com/Semon-Zhang/ProcessWebView? 初學(xué)寫博客 如有不對? 請多多指教 歡迎交流

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容