Android 原生与H5 交互

2020-05-15  本文已影响0人  木木禾木

原生调H5

方式1 mWebView.loadUrl() : 方便简洁,效率低,获取返回值麻烦。不需要获取返回值、对性能要求较低时使用
方式2 mWebView.evaluateJavascript() : 效率高 ,向下兼容性差(仅用于4.4+, API>=19 )

    public void loadJs(String js) {
        // evaluateJavascript在 Android4.4 (API 19)版本之后才可使用,所以使用时需进行版本判断
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
            mWebView.loadUrl(js);
        } else {
            mWebView.evaluateJavascript(js, new ValueCallback<String>() {
                @Override
                public void onReceiveValue(String value) {
                    //此处为 js 返回的结果
                }
            });
        }
    }

使用:

原生调用:
String js = "javascript:showAlertFromAndroid(\"I'm from TestWebViewActivity\")";
mFragment.loadJs(js);

H5中js方法:
<script type="text/javascript">
   
    function showAlertFromAndroid(text){
        alert(text);
    }

</script>


H5调原生

方式1 拦截shouldOverrideUrlLoading 根据不同的url 跳转不同的原生业务

    private class MyWebViewClient extends WebViewClient {

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                view.loadUrl(request.getUrl().toString());
            }
            // 拦截url
            return true;
        }

  }


方式2 拦截onJsPrompt 根据不同的url 跳转不同的原生业务

    private class MyWebChromeClient extends WebChromeClient {
       
        @Override
        public void onReceivedTitle(WebView view, String title) {
            if (onTitleChangedListener != null) {
                onTitleChangedListener.onTitleChanged(title);
            }
        }

        @Override
        public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {
            //拦截JsPrompt,进行业务处理
            //dispatch(message);
            //执行confirm返回结果
            result.confirm("success");
            //true,拦截JavaScript的弹窗。如果拦截了,不会出现弹窗。
            //false,不拦截JavaScript的弹窗,由WebView自行决定弹窗。
            return true;
        }
    }

如下,在 onJsPrompt 中接收到的message 就是 custom://test.com/home/news?name=娱乐&size=30,解析不同的message调起不同的原生业务

<!DOCTYPE html>
<html>
<head>
    <title>test_html</title>

    <script type="text/javascript">

    function myPrompt() {
        var value = "custom://test.com/home/news?name=娱乐&size=30"
        var result = prompt(value,"张某某")
        alert(result);
    }

    </script>
</head>
<body>
<button type="button" id="button3" onclick="showPrompt()">showPrompt</button>
</body>
</html>


方式3 使用mWebView.addJavascriptInterface(object, name)
Android4.2 以前WebView 提供了javascript 调用Java代码的方法,会造成很大的安全漏洞。Android官方在API 17后,限制javascript代码只能调用声明了@JavascriptInterface 注解的Java方法。

如下

   //java的object类对象映射到js的name对象
   mWebView.addJavascriptInterface(new H5ToAndroid(), "H5ToAndroidProxy");

    public class H5ToAndroid {

        @SuppressLint("JavascriptInterface")
        @JavascriptInterface
        public String sendMessage(String message) {
            //拦截message
            return "success";
        }

    }

html代码:

<!DOCTYPE html>
<html>
<head>
    <title>test_html</title>

    <script type="text/javascript">

    function h5ToAndroid() {
        var result = H5ToAndroidProxy.sendMessage("custom://test.com/home/news?name=娱乐&size=30");
        alert(result);
    }

    </script>
</head>
<body>

<br><br>
<button type="button" onclick="h5ToAndroid()">h5ToAndroid</button>
<br><br>

</body>
</html>


哦了,先到这儿吧~


上一篇下一篇

猜你喜欢

热点阅读