webview和h5数据传递

webview的简单加载

webView.loadUrl("https://www.baidu.com/");

加载前需要设置一些属性,如:

WebSettings webSettings = webView.getSettings();
webSettings.setDomStorageEnabled(true); //保存数据
webSettings.setJavaScriptEnabled(true); //启用js
webSettings.setBlockNetworkImage(false); //解决图片不显示
webSettings.setJavaScriptCanOpenWindowsAutomatically(true); //支持通过JS打开新窗口
webSettings.setLoadsImagesAutomatically(true); //支持自动加载图片

h5获取Android数据

webView.addJavascriptInterface(new JSInterface(),"eBookJsInterface");

其中JSInterface()为内部类

public class JSInterface{

        @SuppressLint("JavascriptInterface")
        @JavascriptInterface
        public boolean viewRegulationChanged(){
            return isViewRegulation;
        }

        @JavascriptInterface
        public boolean opeRegulationChanged(){
            return isOpeRegulation;
        }
    }

js可以调用其中函数,从而获取到内部数据。

Android向h5主动发送数据

找到一个好用的方法,可以不用刷新界面,调用js端函数。

webView.evaluateJavascript("javascript:viewRegulationChanged()", new ValueCallback() {
                    @Override
                    public void onReceiveValue(String value) {
                        //此处为 js 返回的结果
                        Log.i(TAG, "onReceiveValue: sendRegulationToJs success");
                    }
                });

其中javascript:viewRegulationChanged()为js端函数名,调用成功后,会输出onReceiveValue中的log。
需要注意的是,如果报错:All WebView methods must be called on the same thread.
则需要切换线程即:

webView.post(new Runnable() {
            @Override
            public void run() {
                webView.evaluateJavascript("javascript:viewRegulationChanged()", new ValueCallback() {
                    @Override
                    public void onReceiveValue(String value) {
                        //此处为 js 返回的结果
                        Log.i(TAG, "onReceiveValue: sendRegulationToJs success");
                    }
                });
            }
        });

若出现白屏或是想做成系统级应用出现的问题见:https://www.jianshu.com/p/e74685db5f52

你可能感兴趣的:(webview和h5数据传递)