js調(diào)用java
1. JavascriptInterface
這是Android提供的Javascript與Native通信的官方解決方案。
首先Java代碼要實現(xiàn)這么一個類,它的作用是提供給Javascript調(diào)用。
public class JavascriptInterface {
@JavascriptInterface
public void showToast(String toast) {
Toast.makeText(MainActivity.this, toast, Toast.LENGTH_SHORT).show();
}
}
然后把這個類添加到WebView的JavascriptInterface中。
webView.addJavascriptInterface(new JavascriptInterface(), "javascriptInterface");
在Javascript代碼中就能直接通過“javascriptInterface”直接調(diào)用了該Native的類的方法。
function showToast(toast) {
javascript:javascriptInterface.showToast(toast);
}
但是這個官方提供的解決方案在Android4.2之前存在安全漏洞。在Android4.2之后,加入了@JavascriptInterface才得到解決。所以考慮到兼容低版本的系統(tǒng),JavascriptInterface并不適合。
如需回調(diào),增加callbackId,通過java to js進行回調(diào)。
2.WebViewClient.shouldOverrideUrlLoading()
攔截所有WebView的Url跳轉(zhuǎn)。頁面可以構(gòu)造一個特殊格式的Url跳轉(zhuǎn),shouldOverrideUrlLoading攔截Url后判斷其格式,然后Native就能執(zhí)行自身的邏輯了。
public class CustomWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (isJsBridgeUrl(url)) {
// JSbridge的處理邏輯
//openURL: jsbridge://publicAccount/pbReport?p=10004&p1=appid%3D1000218%26typeid%3D1000280%26
return true;
}
return super.shouldOverrideUrlLoading(view, url);
}
}
java調(diào)用js
Java通信Javascript只有一種方式。
那就是調(diào)用WebView.loadUrl()去執(zhí)行一個預(yù)先定義好的Javascript方法。
webView.loadUrl(String.format("javascript:JsBridge.handleMessageFromNative(%s)", data));
如需回調(diào),增加callbackId,通過js to java進行回調(diào)。
參考文章