1. 程式人生 > >Android呼叫本地js方法(不顯示h5介面)

Android呼叫本地js方法(不顯示h5介面)

有得時候在開發過程中會遇到,需要呼叫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是這個介面類名中回撥的發方法。