android 混合开发之与js交互

2019-04-18  本文已影响0人  落叶随风花落入泥

Android 与WebView与Js进行交互

1、优缺点:快速迭代,一套代码可以适配Android、IOS和Web前端,缺点是性能对比原生来说偏低。

2、完成网页加载,基本需要以下步骤:
(1)、webView相关配置
(2)、加载loading
(3)、android与js互调,涉及到android调用js方法和js调用android方法。
(4)、防止WebView内存泄露

3、各步骤实施如下:
(1)webview的配置,一般都是封装一个类,这样全局可以使用,减少代码量,代码如下:

public class X5WebView extends WebView {
TextView title;
private WebViewClient client = new WebViewClient() {
    /**
     * 防止加载网页时调起系统浏览器
     */
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if( url.startsWith("http:") || url.startsWith("https:") ) {
            view.loadUrl(url);
            return true;
        } else
            return true;
    }
        //view.loadUrl(url);
        //return true;
};

@SuppressLint("SetJavaScriptEnabled")
public X5WebView(Context arg0, AttributeSet arg1) {
    super(arg0, arg1);
    this.setWebViewClient(client);
    // this.setWebChromeClient(chromeClient);
    // WebStorage webStorage = WebStorage.getInstance();
    initWebViewSettings();
    this.getView().setClickable(true);
}

private void initWebViewSettings() {
    WebSettings s = this.getSettings();
    s.setJavaScriptEnabled(true);
    s.setJavaScriptCanOpenWindowsAutomatically(true);
    s.setAllowFileAccess(true);
    s.setLayoutAlgorithm(LayoutAlgorithm.NARROW_COLUMNS);
    s.setSupportZoom(false);
    s.setBuiltInZoomControls(false);
    s.setUseWideViewPort(true);
    s.setSupportMultipleWindows(true);
    // s.setLoadWithOverviewMode(true);
    s.setAppCacheEnabled(true);
    // s.setDatabaseEnabled(true);
    s.setDomStorageEnabled(true);
    s.setGeolocationEnabled(true);
    s.setAppCacheMaxSize(Long.MAX_VALUE);
    // s.setPageCacheCapacity(IX5WebSettings.DEFAULT_CACHE_CAPACITY);
    s.setPluginState(WebSettings.PluginState.ON_DEMAND);
    // s.setRenderPriority(WebSettings.RenderPriority.HIGH);
    s.setCacheMode(WebSettings.LOAD_NO_CACHE);
    s.setLayoutAlgorithm(LayoutAlgorithm.NARROW_COLUMNS);
    s.setLoadWithOverviewMode(true);
    s.setSavePassword(true);
    s.setSaveFormData(true);
    s.setDomStorageEnabled(true);

    // this.getSettingsExtension().setPageCacheCapacity(IX5WebSettings.DEFAULT_CACHE_CAPACITY);//extension
    // settings 的设计
}
 }

2、加载loading,我们在布局中使用的控件是progressbar,根据需求设置在相应的位置,一般放置在webview的上面,加载进度条代码如下。

  /**
     * 给webview设置加载进度条
     */
    webView.setWebChromeClient(new WebChromeClient() {

        @Override
        public void onProgressChanged(WebView webView, int i) {
            super.onProgressChanged(webView, i);

            if (i == 100) {
                progressBar.setVisibility(View.GONE);

            } else {

                progressBar.setVisibility(View.VISIBLE);
                progressBar.setProgress(i);
            }
        }
    });

3、android 与js互调。
这里注意点:我们必须先加载网页,后面在互相调用(必须先有载体)。
加载本地的网页的代码如下:

 webView.loadUrl("file:///android_asset/web/index.html"); //加载网页

(1)js调用Android端,代码如下,WebFunction类是封装的所有js调用的方法:

 webView.addJavascriptInterface(new WebFunction(), "irootech")

WebFunction类中代码如下:

  /**
 * js调用android
 */
public class WebFunction {
    //这个是js调用android,给我传递参数。参数是相互定义好的
    @JavascriptInterface
    public void getData(String params, String isAnalyse) {
        //js返回的数据是sql的入参
        if (isAnalyse.equals("true")) {
            chartsActivityPresenter.getAnalyseChartsData(params);
        } else if (isAnalyse.equals("false")) {
            try {
                String result = new JSONObject(params).getString("query");
                JSONObject jsonObject = new JSONObject(result);
                chartsActivityPresenter.getSqlData(jsonObject);
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    }
}

(2)Android 调用js中的方法

//这里android 调用js ,通过loadurl,调用js的createChart(),如果传参就定义好,如果不传就直接调用。
webView.loadUrl("javascript:createChart( “参数”)");

4、防止webView内存泄露方案:
核心:让onDetachedFromWindow先走,在主动调用destroy()之前,把webview从它的parent上面移除掉。
https://www.jianshu.com/p/3e8f7dbb0dc7

上一篇下一篇

猜你喜欢

热点阅读