Android与JS互调的简单使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_21983189/article/details/83544650

在项目开发过程中有时会遇到WebView在加载Js页面时,网页上的一些逻辑要通知Android本地进行简单的UI交互或者参数的实时传递,那么就需要我们在Android程序的代码里实现相应的互调配置,以达到互调的效果。下面我直接通过代码实现:

JS调用Android方法:

1、先设置Android中的webview

class WebViewActivity:Activity(){
		 override fun onCreate(savedInstanceState: Bundle?) {
		        super.onCreate(savedInstanceState)
		        setContentView(R.layout.atty_webview_layout)
			    initView()
		} 

		fun initView(){
			with(webview.settings) {
			            // 设置与Js交互的权限
			            javaScriptEnabled = true
			            // 设置允许JS弹窗
			            javaScriptCanOpenWindowsAutomatically = true
			            //防止弹出系统浏览器提示
			            setSupportMultipleWindows(true)
			
			            setSupportZoom(true)
			
			            //设置适应H5,否在会出现白屏
			            domStorageEnabled = true
			            
			            //设置自适应屏幕,两者合用
			            useWideViewPort = true //将图片调整到适合webview的大小
			            loadWithOverviewMode = true // 缩放至屏幕的大小
			        }
			/**
			* 重点是这句设置
			* 设置h5可以回调此类,这里不设置的话,h5就调不通下面的本地方法
			*/
			webview.addJavascriptInterface(this, "Android")

			webview.webViewClient = object : WebViewClient() {
            //覆写shouldOverrideUrlLoading实现内部显示网页,防止弹出系统浏览器提示
            override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean {
                // TODO 自动生成的方法存根
                view.loadUrl(url)
                return true
            }

            override fun onReceivedSslError(view: WebView?, handler: SslErrorHandler?, error: SslError?) {
                // 不要使用super,否则有些手机访问不了,因为包含了一条 handler.cancel(
                //super.onReceivedSslError(view, handler, error)

                // 接受所有网站的证书,忽略SSL错误,执行访问网页
                handler?.proceed()
            }
        }
	        webview.webChromeClient = object : WebChromeClient() {
	            override fun onProgressChanged(view: WebView, newProgress: Int) {
	                // TODO 自动生成的方法存根
	                if (newProgress == 100) {
	                    LoadingDailogUtils.dismiss()
	                    finshRefrash()
	                }
	            }
	        }
		}

	  	//h5回调接口
	    @JavascriptInterface
	    fun jsCallAndroid(msg:String) {
	        ToastUtil.showCenterShort(msg)
	    }
}

2、然后JS的调用使用

<head>
    <meta charset="utf-8">
    <title>Carson</title>
    <script>
	   <!--发出请求-->
        function callAndroid(){
            window.Android.jsCallAndroid("我来自JS");
        }
    </script>
</head>
<body>
<button type="button" id="btn" onclick="callAndroid()">发送</button>
</body>

Android调用JS方法
1、JS中的定义方法

<head>
    <meta charset="utf-8">
    <title>Carson</title>
    <script>
		//这个方法是给Android端提供调用
        function callJS(text){
           alert(text);
        }
    </script>
</head>
<body>
</body>

2、Android端发出请求

        /**
         * Android调用JS
         *
         * 方法二效率高
         * 但是向下兼容差,仅供4.4以上系统使用
         * 建议在4.4以上系统使用
         */
        if (Build.VERSION.SDK_INT < 18) {
            webview.loadUrl("javascript:callJS(“我来自Android”)")
        } else
            webview.evaluateJavascript("javascript:callJS(“我来自Android”)", object : ValueCallback<String> {
                override fun onReceiveValue(p0: String?) {
                    //TODO 处理js返回的结果
                }
            })

总结一下:
Js调用 Android的方式:
1、通过javaScriptEnabled = truedomStorageEnabled = true设置webView可以互调;
2、通过webview.addJavascriptInterface(this, "Android")将本地的方法公开出来;
3、在JS中通过window.Android.调用的方法名("xxx");完成通信。

Android调Js方式:
1、在Js代码中定义接收的方法;
2、在Android代码中通过webview.loadUrl("javascript:callJS()")或者webview.evaluateJavascript("javascript:callJS()",null)方式发出请求.

猜你喜欢

转载自blog.csdn.net/qq_21983189/article/details/83544650
今日推荐