1. 程式人生 > >Android與JS互調的簡單使用

Android與JS互調的簡單使用

在專案開發過程中有時會遇到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)方式發出請求.