Android WebView開發之WebView與Native交互
前言
附GitHub源碼:WebViewExplore
一、JS調用Native的三種方式
1、通過WebView的addJavascriptInterface進行對象映射
需要註意的是這種調用方式,如果你的 minSdkVersion <=16那麼需要考慮到4.2之前的漏洞問題。
mWebView.addJavascriptInterface(new JsCallAndroidInterface(), "JSCallBackInterface");
/** * JS調用android原生方法1: * * 通過WebView的addJavascriptInterface()進行對象映射 */ private class JsCallAndroidInterface { /** *@JavascriptInterface註解方法. * js端調用,4.2以後安全;4.2以前,當JS拿到Android這個對象後, * 就可以調用這個Android對象中所有的方法,包括系統類(java.lang.Runtime 類) * 從而進行任意代碼執行。 * @param msg */ @JavascriptInterface public void callback(String msg) { ToastUtil.showToast(APIWebViewActivity.this, "JS方法回調到web瞭 :" + msg); } }
2、通過WebViewClient shouldOverrideUrlLoading方法回調攔截url:
與url重定向類似,可在此做url的攔截,已達到針對性的調用native方法的目的。
@Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if (resolveShouldLoadLogic(url)) { return true; } return super.shouldOverrideUrlLoading(view, url); }
/** * JS調用android原生方法2: * * 通過WebViewClient shouldOverrideUrlLoading方法回調攔截url * * 根據協議的參數,判斷是否是所需要的url: * 一般根據scheme(協議格式),authority(協議名)來判讀 * * @param url * @return */ private boolean resolveShouldLoadLogic(String url) { Uri uri = Uri.parse(url); if (uri.getScheme().equals("js")) { if (uri.getAuthority().equals("Authority")) { ToastUtil.showToast(APIWebViewActivity.this, "方法2"); } return true; } return false; }
3、通過WebChromeClient的 onJsPrompt()等方法 ,回調攔截JS對話框prompt()等:
/** * 是否支持頁面中的js輸入彈出框 * * @param view * @param url * @param message * @param defaultValue * @param result * @return */ @Override public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) { if (resolveJSPrompt(message)) { return true; } return super.onJsPrompt(view, url, message, defaultValue, result); }
/** * JS調用android原生方法3: * * 通過WebChromeClient的 onJsAlert() onJsConfirm() onJsPrompt() 方法 * 回調攔截JS對話框alert() confirm() prompt() */ private boolean resolveJSPrompt(String message) { Uri uri = Uri.parse(message); if (uri.getScheme().equals("js")) { if (uri.getAuthority().equals("Authority")) { ToastUtil.showToast(APIWebViewActivity.this, "方法3"); } return true; } return false; }
完整源碼
Js調用Native示例源碼-JsToNativeBridgeActivity
二、Native調用WebView的兩種方案
1、loadUrl(“javascript:callJS()”):
此方法簡潔、效率低。當不需要返回值且對性能要求較低時可以考慮使用:
/** * Native調用JS方法一: * 方法簡潔、效率低 * 當不需要獲取返回值且對性能要求較低時可選擇使用。 */ webView.loadUrl("javascript:callJS()");
2、evaluateJavascript(script,resultCallback):
需4.4以上才可使用,效率高且有返回值:
/** * Native調用JS方法二: * 效率高,有返回值(4.4以上系統使用) */ webView.evaluateJavascript("javascript:callJS('yao')", new ValueCallback<String>() { @Override public void onReceiveValue(String value) { //此處為JS返回的結果 Logger.d("value:" + value); } });
完整源碼
Native調用JS示例源碼-NativeToJsBridgeActivity
到此這篇關於Android WebView開發之WebView與Native交互的文章就介紹到這瞭,更多相關Android WebView與Native交互內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Javascript之JSBridge初探
- Android WebView基礎應用詳解
- Android 中 WebView 的基本用法詳解
- Android開發使用WebView打造web app示例代碼
- Android WebView開發之自定義WebView工具框