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

