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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 15:45:33