Android调用本地js方法(不显示h5界面)

在开发过程中有时会遇到这种情况,需要调用js的一些方法,又不需要显示h5界面。比如,在你开发的产品中,PC、h5,移动端(Android、IOS)都需要使用到同一个算法,而且这个算法又非常的复杂,若每个端都写一边,不仅浪费时间,而且如果算法涉及到复杂的数字计算,那么就可能会导致每个端写出来的算法结果不一致。

所以这个时候,使用js编写一个通用算法是比较理想的一个解决方法,因为pc、h5、Android、ios都可以直接调用js代码,并执行计算结果。

Android调用本地js步骤:

步骤一:

在assets下添加你需要执行的js代码

Android调用本地js方法(不显示h5界面)_第1张图片

步骤二:

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增加的方法如下:





    
    






说明:

这里关键就这句代码

window.stub.jsCallbackMethod(bonusJson);

js返回结果到java代码,stub就是在java代码中注册的js回调接口类名,jsCallbackMethod是这个接口类名中回调的发方法。

你可能感兴趣的:(Android调用本地js方法(不显示h5界面))