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中增加我們需要的返回結果。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返回結果到java代碼,stub就是在java代碼中註冊的js回調接口類名,jsCallbackMethod是這個接口類名中回調的發方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章