美文网首页
JS 、Native交互

JS 、Native交互

作者: couriravant | 来源:发表于2019-12-09 12:01 被阅读0次

JS调用Android代码:

  1. Webview.addJavascriptInterface(Object object,String name)
  2. 通过WebViewClient.shouldOverrideUrlLoading()
  3. 通过WebChromeClient.onJsAlert()、onJsConfirm()、onJsPrompt()

Android调用JS:

  1. 通过WebView.loadUrl()
  2. 通过WebView.evaluateJavascript() 版本>= KITKAT 19

细节:

JS调用Android代码:

1. Webview.addJavascriptInterface(Object object,String name)

这个方法可以向加载网页后的window中添加一个原生的java对象,如下例:

native方面:

Webview.addJavascriptInterface(new Android(),”android”);
class Android{
    @JavascriptInterface
    public String sayHello(String message){
              Log.i(“TAG”,”say hello ” + message);
              return “say hello ” + message;
       }
}

这样,JavaScript方面就可以调用到原生的方法

<script>
    var message = window.android.sayHello(“XXX”); 
    // message = “say hello XXX”
</scpirt>

window 对象表示浏览器中打开的窗口。window.android 对象是我们刚通过 Webview. addJavascriptInterface 添加的对象。

2.shouldOverrideUrlLoading

这个方法主要是让 Android 的 WebviewClient. shouldOverrideUrlLoading 方法拦截到 url 请求,相当于一个aop操作,前端那边有三种方式可以产生这个事件:

(1)<a href=“http://m.haodf.com/”>Text</a>
(2) window.location.href=“http://m.haodf.com/”
(3)var iframe = document.createElement(‘iframe’);
    iframe.style.display=‘none’
    iframe.src=http://m.haodf.com;
    document.documentElement.appendChild(iframe);

这个可以看做一种JavaScript调用Native的手段。

Android调用JS

首先在Js上有这么一个方法:
<script>
    function sayHello(name){
        return “say hello ” + name + “ from js.”;
    } 
</script>

在Native通过如下方式就可以执行Js的方法:

// KITKAT 及以上版本:
String script = “window.sayHello(\”XXX\”);”;
webview.evaluateJavascript(script , new ValueCallback<String>(){
    public void onReceiveValue(String value){
        Log.i(TAG,value); // value = say hello from js
    }
});

// KITKAT 以下版本
webview.loadUrl(“javascript:” + script);

evaluateJavascript 方法是 KITKAT 新增的方法,在执行完 Javascript 方法后,可以收到一个 String 的返回值。

refer:https://zhuanlan.zhihu.com/p/32958739

相关文章

网友评论

      本文标题:JS 、Native交互

      本文链接:https://www.haomeiwen.com/subject/rwjbgctx.html