Android应用内WebView按钮点击如何通过DeepLink跳转App指定页面
Android WebView内点击H5按钮通过DeepLink跳转应用内页面实现方案
核心逻辑是通过自定义WebViewClient拦截WebView内的所有跳转请求,识别符合应用规则的DeepLink地址,拦截后交由应用原生路由逻辑跳转,非DeepLink地址交给WebView正常加载网页。
具体实现步骤
1. 配置WebView基础参数与跳转拦截
首先给WebView开启必要配置,设置自定义WebViewClient重写跳转拦截方法,避免链接默认跳转系统浏览器:
val webView = findViewById<WebView>(R.id.web_view) webView.settings.apply { javaScriptEnabled = true // H5通过JS触发跳转时必须开启 domStorageEnabled = true allowFileAccess = false // 关闭非必要权限,降低安全风险 } webView.webViewClient = object : WebViewClient() { // API 24及以上版本走该拦截方法 override fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest?): Boolean { val jumpUrl = request?.url?.toString() ?: return false return if (checkIsAppDeepLink(jumpUrl)) { parseAndJumpDeepLink(jumpUrl) true // 返回true表示当前链接由应用自行处理,WebView不加载网页内容 } else { super.shouldOverrideUrlLoading(view, request) } } // 兼容API 24以下版本 override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean { val jumpUrl = url ?: return false return if (checkIsAppDeepLink(jumpUrl)) { parseAndJumpDeepLink(jumpUrl) true } else { super.shouldOverrideUrlLoading(view, url) } } }
2. 编写DeepLink识别规则
根据自己应用定义的DeepLink规则判断链接是否需要拦截,支持自定义scheme、http/https域名两种匹配方式:
private fun checkIsAppDeepLink(url: String): Boolean { // 匹配自定义scheme的DeepLink,替换为你自己应用的专属scheme即可 val isCustomSchemeLink = url.startsWith("myapp://") // 如果配置了https的App Links,可增加对应域名匹配规则 val isAppLink = url.startsWith("https://www.your-official-domain.com/app/") return isCustomSchemeLink || isAppLink }
3. 实现DeepLink跳转逻辑
识别到DeepLink后,解析Uri并跳转至对应页面,可直接通过原生Intent跳转,也可对接自己项目用的路由框架:
private fun parseAndJumpDeepLink(url: String) { val deepLinkUri = Uri.parse(url) // 原生Intent跳转方式,自动匹配Manifest中配置的对应页面 val jumpIntent = Intent(Intent.ACTION_VIEW, deepLinkUri).apply { flags = Intent.FLAG_ACTIVITY_CLEAR_TOP // 复用栈内页面,避免重复创建实例 } // 跳转前校验是否存在可处理该链接的页面,防止崩溃 if (jumpIntent.resolveActivity(packageManager) != null) { startActivity(jumpIntent) } // 如果项目接入了ARouter等路由框架,可直接调用路由跳转方法 // ARouter.getInstance().build(deepLinkUri).navigation(this) }
4. 清单文件配置目标页面的DeepLink匹配规则
在AndroidManifest.xml中给需要跳转的目标页面配置intent-filter,让系统能识别对应DeepLink指向该页面:
<!-- 示例:商品详情页配置 --> <activity android:name=".GoodsDetailActivity" android:exported="true"> <!-- Android 12+必须显式声明exported属性,否则应用无法安装 --> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <!-- 匹配自定义scheme的DeepLink --> <data android:scheme="myapp" android:host="page" android:pathPrefix="/goodsDetail" /> <!-- 如需支持https的App Links,追加对应data配置即可 --> <!-- <data android:scheme="https" android:host="www.your-official-domain.com" android:pathPrefix="/app/goodsDetail" /> --> </intent-filter> </activity>
5. H5侧按钮跳转逻辑
前端不需要做特殊适配,按照普通网页跳转逻辑写即可:
<!-- 静态a标签跳转 --> <a href="myapp://page/goodsDetail?goodsId=1001">点击查看商品详情</a> <!-- JS触发跳转 --> <button id="jumpBtn">打开商品详情</button> <script> document.getElementById('jumpBtn').addEventListener('click', () => { window.location.href = "myapp://page/goodsDetail?goodsId=1001" }) </script>
注意事项
- 不要在
shouldOverrideUrlLoading方法中执行耗时操作,否则会阻塞WebView的正常加载流程 - 解析DeepLink携带的参数时必须做非空校验,避免前端传参异常导致原生崩溃
- 部分机型WebView加载自定义scheme链接时会触发onReceivedError回调,需要在回调中过滤DeepLink地址,不要展示默认错误页
- 如果需要传递复杂参数、或者是POST形式的跳转,不建议用DeepLink方案,可以直接给WebView添加JavascriptInterface做原生方法直连,稳定性更高
内容的提问来源于stack exchange,提问作者Heleena Joy
相关产品推荐
相关产品推荐

