首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Android WebView 與 JavaScript 交互:攔截 URL 實現原生 Toast 提示

     編輯:程式設計疑難解答

場景需求

在 WebView 載入的網頁中(如抽獎頁),點擊按鈕觸發 JS 邏輯後,需在原生 App 層彈出 Toast 提示(如「恭喜中獎:蘋果」),不跳轉頁面。

核心方案:shouldOverrideUrlLoading 攔截自定義協議

  1. 網頁端:點擊事件中跳轉自定義協議 URL,攜帶參數:
    window.location.href = 'myapp://toast?msg=恭喜中獎:蘋果';
  2. App 端:在 WebViewClient 中重寫 shouldOverrideUrlLoading:
webView.setWebViewClient(new WebViewClient() {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if (url.startsWith("myapp://toast")) {
            // 解析參數
            Uri uri = Uri.parse(url);
            String msg = uri.getQueryParameter("msg");
            // 顯示 Toast
            Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
            return true; // 表示已處理,阻止 WebView 載入該 URL
        }
        return false; // 其他 URL 正常載入
    }
});

進階:支援 Android 4.2+ addJavascriptInterface 方案

若網頁可修改,更推薦使用 @JavascriptInterface 直接暴露原生方法:

class JsBridge {
    @JavascriptInterface
    public void showToast(String msg) {
        runOnUiThread(() -> Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show());
    }
}
webView.addJavascriptInterface(new JsBridge(), "Android");
// 網頁調用:Android.showToast("恭喜中獎:蘋果");

安全提醒

  • addJavascriptInterface 在 Android 4.2 (API 17) 以下有安全漏洞,必須加 @JavascriptInterface 註解並針對性導出方法。
  • 自定義協議方案兼容性更好,但需注意 URL 編碼與特殊字元轉義。

總結

針對無法修改網頁或需兼容舊版本場景,shouldOverrideUrlLoading 攔截自定義協議是最穩健方案;可修改網頁且最低版本 4.2+ 時,addJavascriptInterface 代碼更簡潔直觀。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved