java与js交互,相互调用传参

方式
实现js调用java有四种方式:

1.JavascriptInterface

2.WebViewClient.shouldOverrideUrlLoading()

3.WebChromeClient.onConsoleMessage()

4.WebChromeClient.onJsPrompt()
1
2
3
4
5
6
7
JavascriptInterface 
这种方式是Android官方提供的Javascript与Native通信的解决方案。

java中创建接口

public class DemoInteface {
    @android.webkit.JavascriptInterface
    public void fromJs(String toast) {
        Toast.makeText(MainActivity.this, toast, Toast.LENGTH_SHORT).show();
    }
}
1
2
3
4
5
6
将接口添加到WebView中

webView = (WebView) findViewById(R.id.wb);
WebSettings settings = webView.getSettings();
settings.setJavaScriptEnabled(true);
webView.loadUrl("file:///android_asset/test.html");
webView.addJavascriptInterface(new DemoInteface(), "demo");
1
2
3
4
5
将接口添加到WebView中

<body>

    <a href="javascript:;" class="m-btn" οnclick="showToast('js的问候送达')">Toast</a>

    <script language="javascript">

        function showToast(toast) {
            javascript:demo.fromJs(toast);
        };

    </script>
</body>
1
2
3
4
5
6
7
8
9
10
11
12
注意js中的javascript:demo.fromJs(toast); 其中类名(dmeo)要与 webView.addJavascriptInterface(new DemoInteface(), “demo”);中第二个参数一致,方法名要与接口中方法的名称一致

WebViewClient.shouldOverrideUrlLoading() 
这个方法是拦截webview中所有的url跳转,根据url来判断是否拦截,来执行不同的操作

java代码

public class CustomWebViewClient extends WebViewClient {

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            if (url.contains("toast")) {
                Log.e("yue", url);
                Toast.makeText(MainActivity.this, "拦截成功了", Toast.LENGTH_SHORT).show();
                return true;
            }
            return super.shouldOverrideUrlLoading(view, url);
        }
   }

webView.setWebViewClient(new CustomWebViewClient());
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
js代码

<a href="https://www.baidu.com/?=toast" class="m-btn">Toast2</a>
1


WebChromeClient.onConsoleMessage() 
这是Android提供给Javascript调试在Native代码里面打印日志信息的API。

java

public class CustomWebChromeClient extends WebChromeClient {

        @Override
        public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
            super.onConsoleMessage(consoleMessage);
            String msg = consoleMessage.message();//Javascript输入的Log内容
            Log.d("fromjs",msg);
            return true;
        }
  }

webView.setWebChromeClient(new CustomWebChromeClient());
1
2
3
4
5
6
7
8
9
10
11
12
js代码

<a href="javascript:;" class="m-btn" οnclick="log()">log</a>


function log(){
    console.log('log info from js');
}
1
2
3
4
5
6


WebChromeClient.onJsPrompt() 
除了WebChromeClient.onJsPrompt(),还有WebChromeClient.onJsAlert()和WebChromeClient.onJsConfirm()。顾名思义,这三个Javascript给Native代码的回调接口的作用分别是提示展示提示信息,展示警告信息和展示确认信息。因为极少会用这几种,所以这里就不多做介绍

实现java调用js:

上面说了js调用java有很多方式,常用也是官方推荐的就是前两种,而java调用js就只有一种方式,WebView.loadUrl(),androi 4.4(api 19)以上出现了WebView.evaluateJavascript()来代替loadUrl。

java代码

 button.setOnClickListener(new View.OnClickListener() {
     @Override
      public void onClick(View v) {
          if (android.os.Build.VERSION.SDK_INT >= 19) {
              webView.evaluateJavascript("javascript:wave()", null);
          } else {
              webView.loadUrl("javascript:wave('')");
          }
      }
  });
1
2
3
4
5
6
7
8
9
10
js代码

 var flag = false;
 function wave() {
     if(!flag){
         flag = true;
         document.getElementById("droid").src="testb.png";
     }else{
         flag = false;
         document.getElementById("droid").src="testa.png";
     }

 }
1
2
3
4
5
6
7
8
9
10
11


以上就是一些简单的js与java的交互。要想实现复杂的交互逻辑,可以使用jsBridge这一第三方框架,吓篇博客讲会介绍这一框架的使用及原理。

代码下载: http://download.csdn.net/detail/qq_27942511/9832172
原文:https://blog.csdn.net/qq_27942511/article/details/70738986 
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值