一、在Android開發(fā)中,能實(shí)現(xiàn)Js調(diào)用Native,有4種方法:
- JavascriptInterface
- WebViewClient.shouldOverrideUrlLoading()
- WebChromeClient.onConsoleMessage()
- WebChromeClient.onJsPrompt()
二、JsBridge
1.協(xié)議
Js調(diào)用Native所遵循的協(xié)議
className:指定native層要完成某個(gè)功能調(diào)用的類名
methodName:指定native層要完成某個(gè)功能調(diào)用的方法名
jsonObj:js傳遞過來的參數(shù)
port:port值是指當(dāng)native需要將操作結(jié)果返回給js時(shí),在js中定義一個(gè)callback,并將這個(gè)callback存儲(chǔ)在指定的位置上,這個(gè)port就定義了callback的存儲(chǔ)位置。
2.原理
Js調(diào)用Native是通過window.prompt(url);
Native調(diào)用Js是通過WebView.loadUrl("javascript:function()");。
Js調(diào)用Native: 通過WebView.loadUrl("javascript:function()")
;
Native調(diào)用Js: 通過window.prompt(url)
調(diào)用WebChromeClient中的onJsPromot
方法,然后通過HashMap找到Native中相應(yīng)方法進(jìn)行反射調(diào)用
。Java將處理結(jié)果通過Js帶來的Callback
,通過loadUrl
方式回傳給Js。
Js與Native間的Callback可通過Handler進(jìn)行消息傳遞。CallBack類是用來回調(diào)Js中回調(diào)方法的Java對(duì)應(yīng)類,通過擁有主線程Looper的Handler回調(diào)給Js動(dòng)作。
- 備注
鑒于不同的JsBridge的實(shí)現(xiàn)方式不同,主要區(qū)別在于Js調(diào)用Native以及Handler/MessageQueue對(duì)雙方消息傳遞的使用。所以此文不通用。