Web-based(三) 同JS交互

實現Java和js交互十分便捷。通常只需要以下幾步。

1.WebView開啓JavaScript腳本執行

2.WebView設置供JavaScript調用的交互接口。

3.客戶端和網頁端編寫調用對方的代碼。

Java代碼

前端網頁代碼 (java調用的方法實現)

JS調用Java

調用格式爲window.jsInterfaceName.methodName(parameterValues) 此例中我們使用的是control作爲注入接口名稱。

Java調用JS

webView調用js的基本格式爲webView.loadUrl(“javascript:methodName(parameterValues)”)

調用js無參無返回值函數

調用js有參無返回值函數

注意對於字符串作爲參數值需要進行轉義雙引號。

調用js有參數有返回值的函數

Android在4.4之前並沒有提供直接調用js函數並獲取值的方法,所以在此之前,常用的思路是 java調用js方法,js方法執行完畢,再次調用java代碼將值返回。

1.Java調用js代碼

2.js函數處理,並將結果通過調用java方法返回

3.Java在回調方法中獲取js函數返回值

4. 處理

Android 4.4之後使用evaluateJavascript即可。這裏展示一個簡單的交互示例 具有返回值的js方法

java代碼時用evaluateJavascript方法調用

輸出結果

注意

1.上面限定了結果返回結果爲String,對於簡單的類型會嘗試轉換成字符串返回,對於複雜的數據類型,建議以字符串形式的json返回。

2.evaluateJavascript方法必須在UI線程(主線程)調用,因此onReceiveValue也執行在主線程。

疑問解答

Alert無法彈出

你應該是沒有設置WebChromeClient,按照以下代碼設置

Uncaught ReferenceError: functionName is not defined

問題出現原因,網頁的js代碼沒有加載完成,就調用了js方法。解決方法是在網頁加載完成之後調用js方法


Uncaught TypeError: Object [object Object] has no method

安全限制問題

如果只在4.2版本以上的機器出問題,那麼就是系統處於安全限制的問題了。Android文檔這樣說的

解決方法

1.將targetSdkVersion設置成17或更高,引入@JavascriptInterface註釋

2.自己創建一個註釋接口名字爲@JavascriptInterface,然後將其引入。注意這個接口不能混淆。這種方式不推薦,大概在4.4之後有問題。

注,創建@JavascriptInterface代碼


All WebView methods must be called on the same thread

解決上述的異常,將webview操作放在主線程中即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章