You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android WebView拦截指定URL跳转至原生页面实现方案

Android WebView拦截指定URL跳转原生Activity实现方案

要实现拦截domain.com/login和domain.com/register这类URL并跳转至原生页面,核心是通过自定义WebViewClient并重写shouldOverrideUrlLoading方法拦截URL请求,判断匹配后启动对应的原生Activity。

完整代码示例

1. 主Activity中初始化WebView

import android.content.Intent;
import android.os.Bundle;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import androidx.appcompat.app.AppCompatActivity;

public class MainWebViewActivity extends AppCompatActivity {
    private WebView mWebView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_webview);

        mWebView = findViewById(R.id.webview);
        WebSettings webSettings = mWebView.getSettings();
        // 根据Web应用需求启用JavaScript
        webSettings.setJavaScriptEnabled(true);

        // 设置自定义WebViewClient处理URL拦截
        mWebView.setWebViewClient(new MyWebViewClient());

        // 加载初始Web页面
        mWebView.loadUrl("https://domain.com");
    }

    // 自定义WebViewClient实现URL拦截逻辑
    private class MyWebViewClient extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            // 匹配目标URL并跳转对应原生页面
            if (url.startsWith("https://domain.com/login")) {
                startActivity(new Intent(MainWebViewActivity.this, LoginActivity.class));
                return true; // 返回true表示拦截该URL,禁止WebView加载
            } else if (url.startsWith("https://domain.com/register")) {
                startActivity(new Intent(MainWebViewActivity.this, RegisterActivity.class));
                return true;
            }
            // 非目标URL交由WebView正常加载
            return false;
        }
    }

    // 处理WebView返回逻辑(可选)
    @Override
    public void onBackPressed() {
        if (mWebView.canGoBack()) {
            mWebView.goBack();
        } else {
            super.onBackPressed();
        }
    }
}

2. 配置AndroidManifest.xml

  • 添加网络权限:
<uses-permission android:name="android.permission.INTERNET" />
  • 注册对应的原生Activity:
<activity android:name=".LoginActivity" />
<activity android:name=".RegisterActivity" />
<activity android:name=".MainWebViewActivity">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

关键说明

  • shouldOverrideUrlLoading是拦截URL的核心方法:返回true表示拦截当前请求,WebView不会加载该URL;返回false则让WebView继续处理。
  • 若Web应用通过JavaScript(如window.location.href)跳转URL,该方法同样能拦截到。
  • 如需更灵活的匹配规则(比如支持子域名、模糊路径),可改用正则表达式:
import java.util.regex.Pattern;
import java.util.regex.Matcher;

// ...
Pattern pattern = Pattern.compile("^https://.*domain.com/(login|register)$");
Matcher matcher = pattern.matcher(url);
if (matcher.matches()) {
    String path = matcher.group(1);
    if ("login".equals(path)) {
        startActivity(new Intent(MainWebViewActivity.this, LoginActivity.class));
    } else if ("register".equals(path)) {
        startActivity(new Intent(MainWebViewActivity.this, RegisterActivity.class));
    }
    return true;
}

内容的提问来源于stack exchange,提问作者mkirk03

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 04:30:06