首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Android 混合開發:Java 與 JavaScript 雙向互調完整指南

     編輯:Java 程式設計入門

應用場景

HTML5 跨平台應用中,WebView 載入 H5 頁面時,常需實現:
① JS 呼叫 Native(Java)功能(如相機、支付、推送)
② Native 主動觸發 JS 邏輯(如頁面刷新、彈窗、數據回填)

方案一:JS 呼叫 Java(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 攻擊。

方案二:Java 呼叫 JS(loadUrl("javascript:..."))

String resUrl = "aa";
String resId = "bb";
// 注意:多參數需正確拼接字串,字串參數需雙層轉義
String callBack = "javascript:callBackServive('" + resUrl + "','" + resId + "')";
this.appView.loadUrl(callBack);

JS 端預留:function callBackServive(url, id) { ... }

進階替代方案(API 19+ 推薦)

evaluateJavascript() 非同步執行、無 URL 長度限制、可直接獲取 JS 返回值:

webView.evaluateJavascript("javascript:callBackServive('aa','bb')", 
    new ValueCallback<String>() {
        @Override
        public void onReceiveValue(String value) {
            // value 即 JS 函數的返回值
        }
    });

最佳實踐總結

方向API適用版本關鍵點
JS → JavaaddJavascriptInterface全版本API 17+ 需 @JavascriptInterface,注意安全
Java → JSloadUrl("javascript:...")全版本同步、URL 長度限制、參數轉義易出錯
Java → JSevaluateJavascriptAPI 19+非同步、支援返回值、無長度限制、推薦
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved