Android呼叫本地js方法(不顯示h5介面)
阿新 • • 發佈:2018-12-09
有得時候在開發過程中會遇到,需要呼叫js的一些方法,又不需要顯示h5介面。比如,在你開發的產品中,PC、h5,移動端(Android、IOS)都需要使用到同一個演算法,而且這個演算法又非常的複雜,若每個端都寫一邊,不僅非常浪費時間,而且如果演算法設計到複雜的數字計算,那麼就可能會導致每個端寫出來的演算法結果不一致。
所以這個時候,使用js編寫演算法是比較理想的一個解決方法,因為pc、h5、Android、ios都可以直接呼叫js程式碼,並執行計算結果。
Android呼叫本地js:
步驟一:
在assets下新增你需要執行的js程式碼
步驟二:
Android程式碼
WebView mWebView = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (mWebView == null) { initWebView(); } getPrxResult(); } /** * 呼叫js方法 */ private void getPrxResult(){ String e =""; String t =""; String url2 = "javascript:jclqBonusRange(" + e + "," + t + ")"; //呼叫js方法 mWebView.loadUrl(url2); } /** * 初始化webview */ protected void initWebView() { mWebView = new WebView(this); mWebView.getSettings().setDefaultTextEncodingName("utf-8"); mWebView.getSettings().setJavaScriptEnabled(true); mWebView.addJavascriptInterface(new JsToJava(), "stub"); //JsToJava是內部類,程式碼在後面。stub是介面名字。 mWebView.loadUrl("file:///android_asset/bonus_helper.html"); //js檔案路徑 mWebView.setWebViewClient(new WebViewClient() { @Override public void onPageFinished(WebView view, String url) { // String urlinit = "javascript:footballHelper.Es.jclq.setContent()"; // mWebView.loadUrl(urlinit); } }); } /** * js方法回撥 */ private class JsToJava { @JavascriptInterface public void jsCallbackMethod(String result) { Log.e("444", "result==" + result); } } @Override public void onDestroy() { super.onDestroy(); cleanWebView(); } void cleanWebView() { // 清WebView // 清WebView if (mWebView != null) { CookieSyncManager.createInstance(this); CookieManager cookieManager = CookieManager.getInstance(); cookieManager.removeAllCookie(); CookieSyncManager.getInstance().sync(); mWebView.setWebChromeClient(null); mWebView.setWebViewClient(null); mWebView.getSettings().setJavaScriptEnabled(false); mWebView.loadDataWithBaseURL(null, "", "text/html", "utf-8", null); mWebView.clearHistory(); mWebView.clearCache(true); mWebView.freeMemory(); mWebView.removeAllViews(); mWebView.destroy(); mWebView = null; } }
說明:
mWebView.addJavascriptInterface(new JsToJava(), "stub"); //JsToJava是內部類,程式碼在後面。stub是介面名字。
JsToJava:類JsToJava是我們向WebView註冊一個名叫“JsToJava”的物件,然後在JS中可以訪問到JsToJava這個物件,就可以呼叫這個物件的一些方法,最終可以呼叫到Java程式碼中,從而實現了JS與Java程式碼的互動。
"stub":實際上就是上述類起的一個名字,任意定義。在js回撥到java程式碼時,需要通過這個name叫stub的介面進行回撥。
String url2 = "javascript:jclqBonusRange(" + e + "," + t + ")"; //呼叫js方法
這裡是案例的js程式碼的方法,以下會說明。
步驟三:
一般情況下,js只提供完成相關業務的邏輯方法,方便各端通用。Android呼叫這樣的邏輯,一般需要再次進行處理,在js中增加我們需要的返回結果。上述java程式碼呼叫js案例增加的方法如下:
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title></title> </head> <body> <script type="text/javascript" charset="utf-8"> /********************這裡是萬把行的js邏輯程式碼*******************/ /** * 增加的方法,java呼叫,同時返回結果到java中 */ function jclqBonusRange(e,t){ var objectE = JSON.parse(e); var objectT = JSON.parse(t); lotteryId = 30105; bs = 1 footballCalc.countRange(objectE,objectT,bs,lotteryId); var bonus = Es.jclq.getHitList(objectE,objectT); var bonusJson = JSON.stringify(bonus); window.stub.jsCallbackMethod(bonusJson); } </script> </body> </html>
說明:
window.stub.jsCallbackMethod(bonusJson);
js返回結果呼叫,stub就是在java程式碼中註冊的js回撥介面類名,jsCallbackMethod是這個介面類名中回撥的發方法。