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

如何强制应用内deeplink链接跳转Chrome而非打开安卓应用

问题原因

你当前配置的DeepLink仅匹配路径规则,未对查询参数做限制,因此带show-checkout-modal=true的购票链接也会被App捕获。同时你使用的隐式ACTION_VIEW Intent会将所有符合匹配规则的应用(包括你自己的App)纳入可选处理列表,默认选中自身App时就会触发跳转循环。

解决方案

下面提供3种可直接落地的方案,你可以根据业务场景选择:

方案1:DeepLink入口直接拦截购票链接(改造成本最低)

在你配置DeepLink对应的目标页面/Activity的初始化逻辑最开头,先判断URI的查询参数,命中购票规则直接唤起浏览器并关闭当前页面:

// 放在目标页面 onCreate/onCreateView 最开始的位置
val uri = intent.data ?: return
if (uri.getQueryParameter("show-checkout-modal") == "true") {
    val browserIntent = Intent(Intent.ACTION_VIEW, uri).apply {
        addCategory(Intent.CATEGORY_BROWSABLE)
        // 避免匹配到自身App
        `package` = null
    }
    // 校验处理应用不是自身
    val resolveInfo = packageManager.resolveActivity(browserIntent, PackageManager.MATCH_DEFAULT_ONLY)
    if (resolveInfo?.activityInfo?.packageName == packageName) {
        // 匹配到自身时用选择器让用户手动选浏览器
        startActivity(Intent.createChooser(browserIntent, "请选择浏览器打开"))
    } else {
        startActivity(browserIntent)
    }
    // 关闭当前页面,不要走后续业务逻辑
    finish()
    return
}

方案2:修改唤起浏览器的Intent,强制仅浏览器响应

修改你现有唤起浏览器的代码,过滤掉自身App,从源头避免唤起自身:

val targetUri = Uri.parse(localePath)
val browserIntent = Intent(Intent.ACTION_VIEW, targetUri).apply {
    addCategory(Intent.CATEGORY_BROWSABLE)
    type = "text/html"
}
// 查询所有可处理的应用,排除自身
val availableBrowsers = packageManager.queryIntentActivities(browserIntent, 0)
var targetPackage: String? = null
for (info in availableBrowsers) {
    if (info.activityInfo.packageName != packageName) {
        targetPackage = info.activityInfo.packageName
        break
    }
}
if (targetPackage != null) {
    browserIntent.`package` = targetPackage
    startActivity(browserIntent)
} else {
    // 无符合条件的浏览器,用系统选择器
    startActivity(Intent.createChooser(browserIntent, "请选择浏览器打开"))
}

方案3:调整DeepLink匹配规则,排除购票场景

如果你使用的是Navigation组件的DeepLink配置,可以新增规则限制参数,让带show-checkout-modal=true的链接匹配后直接走拦截逻辑:

<!-- 原有规则新增参数绑定 -->
<deepLink app:uri="acc-web.dotoo.app/en/dotoo/{dotoo_id}?show-checkout-modal={showCheckout}" />
<!-- 在目标页面的参数声明里设置默认值 -->
<argument
    android:name="showCheckout"
    app:argType="boolean"
    android:defaultValue="false" />

在页面初始化时判断showCheckout参数为true时直接走方案1的拦截逻辑即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 07:45:06