Android Native与Html互相调用

本文介绍如何使用WebView.addJavascriptInterface实现H5与Android Native的双向通信,包括JS调用Native方法展示消息及Native调用JS方法更新页面内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JS调用Android原生

Js调用原生的有很多种,有使用通过在js中打开一个url,android采用拦截Url的形式获取参数,执行android 原生的代码逻辑,比如跳转或者弹出键盘。 也有使用prompt 实现,通过调用html的prompt方法,android这边通过WebChromeClient方法的boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result)回调。同样通过与前端沟通好的协议,完成自己的Native代码逻辑。而本文采用WebView.addJavascriptInterface实现H5与Native通信

public class JavaScriptUtil {

    private TextView mTextView;

    public JavaScriptUtil(TextView textView) {
        mTextView = textView;
    }

    @JavascriptInterface
    public void receiveByJs(String content) {
        mTextView.setText(content);
    }

}
//Activity中写入这样的代码
mWebView = findViewById(R.id.web_view);
mWebView.getSettings().setJavaScriptEnabled(true);//支持Js
JavaScriptUtil mJavaScriptUtil = new JavaScriptUtil(tv_content);
mWebView.addJavascriptInterface(mJavaScriptUtil, "jsCallNative");
mWebView.loadUrl("file:///android_asset/index.html"

对应的html页面只需要调用即可。

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>JsBridge</title>
    <script type="text/javascript">
        function h5CallNative(){
            var content = "我是来自Html的消息";
            //jsCallNative 可以理解成我们传入的JavaScriptUtil 对象
            jsCallNative.receiveByJs(content);
        }
		//暂时不能管这个方法
        function nativeCallH5(message){
            document.getElementById("demo").innerHTML=message;
        }
    </script>
</head>
<body>

<button onclick="h5CallNative()">H5调用原生</button>

<p id="demo"></p>

</body>
</html>

Android原生调用JS

同样是调用上面的html文件,有一点不同的是android端的调用只需要调用loadUrl 或者 evaluateJavascript api 就可以调用到js的方法。其中
mWebView.loadUrl("javascript:nativeCallH5('"+nativeMessage+"')") 方式是android 4.4以前的方法。 android 4.4以后使用方式二 mWebView.evaluateJavascript("javascript:nativeCallH5('"+nativeMessage+"')",new ValueCallback<String>() {}调用js的方法。ValueCallback是js的返回值。

    private void nativeCallH5(final String nativeMessage) {
        mWebView.post(new Runnable() {
            @Override
            public void run() {
                //方式一
                // mWebView.loadUrl("javascript:nativeCallH5('"+nativeMessage+"')");
                
                //方式二
                mWebView.evaluateJavascript("javascript:nativeCallH5('"+nativeMessage+"')",
                        new ValueCallback<String>() {
                            @Override
                            public void onReceiveValue(String value) {
                                Log.d(TAG, "onReceiveValue: " + value);
                            }
                        });
            }
        });
    }

注意:javascript:nativeCallH5('"+nativeMessage+"')" 里面有个单引号,如果传递的参数是字符串就要加单引号,数字可以不加。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值