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

随着前端技术的发展与H5的广泛使用,移动端采用native+h5的方式越来越多了,对于Android来说就涉及到java与js的交互,相互调用传参等。下面就来看一下java与js交互的简单demo。
方式

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

1.JavascriptInterface

2.WebViewClient.shouldOverrideUrlLoading()

3.WebChromeClient.onConsoleMessage()

4.WebChromeClient.onJsPrompt()

   

    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();
            }
        }
            

        将接口添加到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");
            

        将接口添加到WebView中

        <body>

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

            <script language="javascript">

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

            </script>
        </body>
          

        注意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());
       

    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());
       

    js代码

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


    function log(){
        console.log('log info from js');
    }


    

 



    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('')");
          }
      }
  });


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";
     }

 }


 



 



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

代码下载: http://download.csdn.net/detail/qq_27942511/9832172

 

posted @ 2019-04-10 17:22  brave-sailor  阅读(1626)  评论(0编辑  收藏  举报