Android與JS互調的簡單使用
阿新 • • 發佈:2019-02-05
在專案開發過程中有時會遇到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 = true
和domStorageEnabled = 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)
方式發出請求.