Android原生方法和Web JS互相调用

准备工作

  1. 新建一个Android项目
  2. 准备一个html文件,为了简化,直接放到项目的assets目录下调用

JS调用Android原生方法

在Android项目中

配置WebView,WebView的配置中必须启用JavaScript,添加JavaScript的入口接口,方法如下:
webView.getSettings().setJavaScriptEnabled(true);
webView.addJavascriptInterface(new H5Interface(MainActivity.this, webView), "h5_android");

在html文件中

添加JavaScript代码 在JavaScript中调用Android本地接口的格式是“本地JavaScript接口名称.接口方法名称”,接口名称是Android WebView调用addJavascriptInterface方法时的第二个参数,方法如下:
h5_android.login(platform, extInfo);

Android原生方法调用JS

在html中

添加JavaScript代码,编写一个JavaScript方法


在Android项目中

在打开当前页面的WebView对象,调用loadUrl方法执行JavaScript方法,URL格式为"javascript:JavaScript方法名()",但必须注意的是,如果JavaScript方法的参数是字符串,必须添加单引号将内容括起来,否则会当做一个对象,方法如下:
mmWebView.loadUrl(String.format("javascript:onLoginResult('%s')", "登录取消"));
注意:调用loadUrl的WebView对象必须是打开当前页面的WebView


本地JavaScript调用入口类代码如下:
class H5Interface {

    private Activity mmActivity;
    private WebView mmWebView;

    public H5Interface(Activity activity, WebView webView) {
        this.mmActivity = activity;
        this.mmWebView = webView;
    }

    @JavascriptInterface
    public void login(String platform, String extInfo) {
        mmActivity.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                WAUserProxy.loginUI(mmActivity, false, new WACallback<WALoginResult>() {
                    @Override
                    public void onSuccess(int i, String s, WALoginResult waLoginResult) {
                        mmWebView.loadUrl(String.format("javascript:onLoginResult('%s')", new Gson().toJson(waLoginResult)));
                    }

                    @Override
                    public void onCancel() {
                        mmWebView.loadUrl(String.format("javascript:onLoginResult('%s')", "登录取消"));
                    }

                    @Override
                    public void onError(int i, String s, WALoginResult waLoginResult, Throwable throwable) {
                        mmWebView.loadUrl(String.format("javascript:onLoginResult('登录失败:\ncode: %d\n message: %s')", i, s));
                    }
                });
            }
        });
    }
}
上面代码中可以看到,H5Interface类中有一个login成员方法,这个方法就是在html页面的JavaScript中调用的。 注意:开放给JavaScript调用的方法必须添加@JavascriptInterface注解,在 JELLY_BEAN/API 16/4.1开始必须添加,否则JavaScript无法调用到这个接口

html代码如下
<!DOCTYPE html>
<html>
<head>
    <script type="text/javascript">
        function login(platform, extInfo) {
            h5_android.login(platform, extInfo);
        }

        function onLoginResult(result) {
            document.getElementById("messageArea").textContent = result
        }
    </script>
</head>
<body>
    <h1 align="center">Android与JS互调示例</h1>

    <h2>JS调用Android原生功能</h2>
    <input type="button"
           style="width:100%; font-size: 25px"
           value="登录"
           onClick="login('', '')"/>

    <h2>Android调用JS</h2>
    <div style="font-size: 25px">登录结果:</div>
    <div style="width: 100%">
        <textarea id="messageArea" rows="10" style="width: 100%; font-size: 25px"></textarea>
    </div>
</body>
</html>
特别注意:JS执行的代码不在Android的UI线程中,是在WebView Core的线程中,所以JS调用Android的接口中,需要添加到Activity.runOnUiThread中


  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
是的,为了实现在Web页面中与iOS和Android原生应用程序之间的交互,可以使用JSBridge。JSBridge是一个桥接工具,可以将JavaScript与原生应用程序之间的通信连接起来。 在iOS中,可以使用JavaScriptCore框架和WKWebView来实现JSBridge。在Android中,可以使用WebView和JavaScriptInterface来实现JSBridge。 具体来说,需要在原生应用程序中创建一个JavaScriptInterface类,该类可以实现JavaScript与原生代码之间的通信。然后在Web页面中,可以通过JavaScript调用原生应用程序中的方法。 例如,在iOS中,可以使用以下代码创建一个JavaScriptInterface类: ``` @objc class JSInterface: NSObject { weak var webView: WKWebView? init(webView: WKWebView) { self.webView = webView super.init() } @objc func showToast(_ message: String) { let alertController = UIAlertController(title: "Toast", message: message, preferredStyle: .alert) let okAction = UIAlertAction(title: "OK", style: .default, handler: nil) alertController.addAction(okAction) self.webView?.viewController?.present(alertController, animated: true, completion: nil) } } ``` 然后在Web页面中,可以通过以下代码调用原生应用程序中的showToast方法: ``` window.webkit.messageHandlers.jsInterface.postMessage({action: 'showToast', message: 'Hello world!'}); ``` 在Android中,可以使用以下代码创建一个JavaScriptInterface类: ``` public class JSInterface { private Context context; public JSInterface(Context context) { this.context = context; } @JavascriptInterface public void showToast(String message) { Toast.makeText(context, message, Toast.LENGTH_SHORT).show(); } } ``` 然后在Web页面中,可以通过以下代码调用原生应用程序中的showToast方法: ``` window.jsInterface.showToast('Hello world!'); ``` 通过这种方式,可以实现JavaScript与iOS和Android原生应用程序之间的交互。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值