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

Android/Kotlin应用深度链接配置:自定义Chrome Tab替代WebView

嘿,我懂你想要的效果——把特定深度链接直接导向原生页面,而不是都塞进WebView里,对吧?我帮你一步步搞定这个优化,让你的深度链接真正实现原生体验:

一、先补全Intent过滤器的关键配置

你现有的Intent过滤器应该没写完<data>标签吧?这可是深度链接能被系统识别的核心!根据你用的链接类型(自定义Scheme或绑定域名的http/https链接),补全配置:

自定义Scheme(比如futurity://)的配置

<activity android:name=".activity.DeepLinkEntryActivity"> <!-- 后面会说为啥用这个专门的入口 -->
    <intent-filter android:label="Futurity">
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" /> <!-- 必须加,让浏览器能唤起APP -->
        <!-- 匹配自定义scheme的链接,比如futurity://app/product/123 -->
        <data
            android:scheme="futurity"
            android:host="app"
            android:pathPrefix="/product" />
    </intent-filter>
</activity>

绑定域名的http/https链接配置

<intent-filter android:label="Futurity">
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    <!-- 匹配https://your-domain.com/app/product/123这类链接 -->
    <data
        android:scheme="https"
        android:host="your-domain.com"
        android:pathPrefix="/app/product" />
</intent-filter>
二、核心:解析链接并跳转原生页面

我建议你专门建一个DeepLinkEntryActivity作为深度链接的唯一入口(比直接用WebViewActivity更干净),它的作用就是解析链接参数、跳转到对应原生页面,之后自动关闭自己:

class DeepLinkEntryActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // 解析Intent携带的深度链接数据
        intent.data?.let { uri ->
            val path = uri.path
            val params = uri.queryParameterNames.associateWith { uri.getQueryParameter(it) }

            // 根据路径匹配对应的原生页面
            when {
                path?.startsWith("/product") == true -> {
                    // 提取商品ID,比如从/product/123里拿到123
                    val productId = path.split("/").lastOrNull()
                    if (!productId.isNullOrEmpty()) {
                        val intent = Intent(this, ProductDetailActivity::class.java).apply {
                            putExtra("PRODUCT_ID", productId)
                            addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP) // 避免重复打开页面
                        }
                        startActivity(intent)
                    }
                }
                path?.startsWith("/profile") == true -> {
                    // 跳转到个人中心原生页面
                    startActivity(Intent(this, ProfileActivity::class.java))
                }
                // 可以添加更多页面的匹配规则...
                else -> {
                    // 兜底逻辑:没有匹配到原生页面时,再跳转到WebView打开链接
                    val intent = Intent(this, WebViewActivity::class.java).apply {
                        putExtra("URL", uri.toString())
                    }
                    startActivity(intent)
                }
            }
        }
        // 处理完跳转就关闭这个入口Activity
        finish()
    }
}
三、优化细节:提升体验&避免异常
  • 给跳转的Intent加上FLAG_ACTIVITY_SINGLE_TOP或FLAG_ACTIVITY_CLEAR_TOP,避免重复打开相同页面。
  • 要处理uri为空的异常情况,防止崩溃。
  • 如果是http/https链接,Android 6.0+需要配置assetlinks.json放在域名根目录,让系统确认你的APP是该域名的合法持有者,避免弹出应用选择框。
四、快速测试深度链接的小技巧

用adb命令直接唤起,不用每次都手动点击链接:

# 测试自定义Scheme链接
adb shell am start -W -a android.intent.action.VIEW -d "futurity://app/product/123" com.your.package.name

# 测试http/https链接
adb shell am start -W -a android.intent.action.VIEW -d "https://your-domain.com/app/product/123" com.your.package.name

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:23:15