原文: https://www.jianshu.com/p/345f4d8a5cfa
1.Android調用JS的方法有2種:
(1)通過WebView的loadUrl()
// 調用js中的函數:jsFun(msg)
webView.loadUrl("javascript:jsFun('" + msg + "')");
(2)通過WebView的evaluateJavascript()
mWebView.evaluateJavascript("javascript:callJS()", new ValueCallback<String>() {
@Override
public void onReceiveValue(String value) {
//此處為 js 返回的結果
}
});
}
a)、比第一種方法效率更高、使用更簡潔,因為該方法的執行不會使頁面刷新,而第一種方法(loadUrl )的執行則會。
b)、Android 4.4 后才可使用
結論:
建議兩種方法混合使用,即Android 4.4以下使用loadUrl,Android 4.4以上evaluateJavascript
2.JS調用Android的方法有3種:
(1)通過WebView的addJavascriptInterface()進行映射
a)被JS調用的方法必須加入@JavascriptInterface注解
b) 存在嚴重的漏洞問題
(2)通過 WebViewClient 的shouldOverrideUrlLoading ()方法回調攔截 url
a)Android通過 WebViewClient
的回調方法shouldOverrideUrlLoading ()
攔截 url
b)解析該 url 的協議, 如果檢測到是預先約定好的交互協議,就調用相應方法
- 優點:不存在方式1的漏洞;
- 缺點:JS獲取Android方法的返回值復雜。 如果JS想要得到Android方法的返回值,只能通過 WebView 的
loadUrl ()
去執行 JS 方法把返回值再傳遞給H5.
(3)通過 WebChromeClient 的onJsAlert()、onJsConfirm()、onJsPrompt()方法回調攔截JS對話框alert()、confirm()、prompt() 消息
原理:Android通過 WebChromeClient
的onJsAlert()
、onJsConfirm()
、onJsPrompt()
方法回調分別攔截JS對話框 (即上述三個方法),得到他們的消息內容,然后解析, 和方法(2)類似處理。
a)常用的攔截:攔截 JS的提示框(即prompt()
方法),因為onJsPrompt調用較少,而onJsAlert、onJsConfirm調用頻繁
b) 只有prompt()
可以返回任意類型的值,操作最全面方便、更加靈活;而alert()對話框沒有返回值;confirm()對話框只能返回兩種狀態(確定 / 取消)兩個值