美文网首页
技能树-android基础-Web交互

技能树-android基础-Web交互

作者: 6faef730638b | 来源:发表于2018-04-20 14:27 被阅读25次

Web交互即 webview与js的交互

Webview调用JS

// 文本名:javascript
<!DOCTYPE html>
<html>
   <head>
      <meta charset="utf-8">
      <title>Carson_Ho</title>
     <script>
// Android需要调用的方法
   function callJS(){
      alert("Android调用了JS的callJS方法");
   }
</script>
   </head>
</html>

loadUrl()

mWebView.loadUrl("javascript:callJS()");

evaluateJavascript()

  mWebView.evaluateJavascript("javascript:callJS()", new ValueCallback<String>() {
        @Override
        public void onReceiveValue(String value) {
            //此处为 js 返回的结果
        }
    });
}

JS调用Webview

addJavascriptInterface()进行对象映射

mWebView.addJavascriptInterface(new AndroidtoJs(WebViewActivity.this), "index");


public class AndroidtoJs extends Object {
    // 定义JS需要调用的方法
    // 被JS调用的方法必须加入@JavascriptInterface注解
    @JavascriptInterface
    public boolean register() {
            Logger.e("xxx");
            return false;
    }
}
<!DOCTYPE html>
<html>
   <head>
      <meta charset="utf-8">
      <title>Carson</title>  
      <script>
         function callAndroid(){
        // 由于对象映射,所以调用test对象等于调用Android映射的对象
            index.register();
         }
      </script>
   </head>
   <body>
      //点击按钮则调用callAndroid函数
      <button type="button" id="button1" onclick="callAndroid()"></button>
   </body>
</html>

通过WebViewClient的shouldOverrideUrlLoading ()拦截 url

<!DOCTYPE html>
<html>

   <head>
      <meta charset="utf-8">
      <title>Carson_Ho</title>

     <script>
         function callAndroid(){
            /*修改url为约定的url协议为:js://webview?arg1=111&arg2=222*/
            document.location = "js://webview?arg1=111&arg2=222";
         }
      </script>
</head>

<!-- 点击按钮则调用callAndroid()方法  -->
   <body>
     <button type="button" id="button1" onclick="callAndroid()">点击调用Android代码</button>
   </body>
</html>

点击按钮改变url ,webviewclient可以拿到这个url

Uri uri = Uri.parse(url);   
if ( uri.getScheme().equals("js")) {
    if (uri.getAuthority().equals("webview")) {
           HashMap<String, String> params = new HashMap<>();
           Set<String> collection = uri.getQueryParameterNames();
          //拿到协议中的参数转而执行android里的函数
    }
}

通过WebChromeClient 的方法回调拦截JS对话框

onJsAlert()、onJsConfirm()、onJsPrompt()对应
alert()、confirm()、prompt() 消息

推荐使用onJsPrompt()
因为只有prompt()可以返回任意类型的值

<script>
    function clickprompt(){
    // 调用prompt()
    var result=prompt("js://demo?arg1=111&arg2=222");
    alert("demo " + result);
}
</script>


<body>
     <button type="button" id="button1" onclick="clickprompt()">点击调用Android代码</button>
</body>

mWebView.setWebChromeClient(new WebChromeClient() {
@Override
public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {
    //拿到message(传来的url)解析
  }
}

总结

android调用js的两种方法比较
第二种api要求高 但是页面无需刷新 且可以拿js的返回值

js调用android比较
第一种对象映射比较简单灵活 但是会有安全漏洞问题
第二种第三种都是一种拦截url解析方式 使用复杂 但没有漏洞问题

总结

相关文章

网友评论

      本文标题:技能树-android基础-Web交互

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