HTML5 跨平台應用中,WebView 載入 H5 頁面時,常需實現:
① JS 呼叫 Native(Java)功能(如相機、支付、推送)
② Native 主動觸發 JS 邏輯(如頁面刷新、彈窗、數據回填)
addJavascriptInterface)public class CzingLBWebMain extends DroidGap {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.loadUrl("file:///android_asset/www/czingIndexHome.html");
WebSettings webSettings = this.appView.getSettings();
webSettings.setJavaScriptEnabled(true); // 必須開啟
// 關鍵:將 Java 物件暴露給 JS,名為 "appDownloader"
this.appView.addJavascriptInterface(this, "appDownloader");
}
// 被 JS 呼叫的方法,需加 @JavascriptInterface (API 17+)
@JavascriptInterface
public void callBackJava() {
// Native 邏輯:拍照、掃碼、Toast 等
}
}
JS 端調用:window.appDownloader.callBackJava()
安全警示:API 17+ 必須在暴露方法上加
@JavascriptInterface註解,否則方法不可被調用;切勿暴露敏感系統 API,防止 XSS 攻擊。
loadUrl("javascript:..."))String resUrl = "aa";
String resId = "bb";
// 注意:多參數需正確拼接字串,字串參數需雙層轉義
String callBack = "javascript:callBackServive('" + resUrl + "','" + resId + "')";
this.appView.loadUrl(callBack);
JS 端預留:function callBackServive(url, id) { ... }
evaluateJavascript() 非同步執行、無 URL 長度限制、可直接獲取 JS 返回值:
webView.evaluateJavascript("javascript:callBackServive('aa','bb')",
new ValueCallback<String>() {
@Override
public void onReceiveValue(String value) {
// value 即 JS 函數的返回值
}
});
| 方向 | API | 適用版本 | 關鍵點 |
|---|---|---|---|
| JS → Java | addJavascriptInterface | 全版本 | API 17+ 需 @JavascriptInterface,注意安全 |
| Java → JS | loadUrl("javascript:...") | 全版本 | 同步、URL 長度限制、參數轉義易出錯 |
| Java → JS | evaluateJavascript | API 19+ | 非同步、支援返回值、無長度限制、推薦 |