實現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操作放在主線程中即可。