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
相关产品推荐
相关产品推荐

