Firebase Dynamic Link 多实例启动问题求助(WhatsApp/SMS场景)
我之前在做Firebase动态链接的时候也踩过这个坑——从WhatsApp或者短信点链接,明明应用已经在后台跑着,结果又启动了一个新实例,着实头疼。下面几个方案亲测有效,你可以一步步试:
1. 调整应用的启动模式(核心修复)
Android默认的standard启动模式会给每个Intent创建新的Activity实例,这就是重复启动的根源。你需要把处理动态链接的主Activity的启动模式改成singleTask(推荐,不会完全隔离应用)或者singleInstance。
在AndroidManifest.xml里修改对应Activity的配置:
<activity android:name=".MainActivity" android:launchMode="singleTask"> <!-- 主入口的Intent Filter --> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <!-- Firebase动态链接的Intent Filter --> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:host="你的动态链接域名.page.link" android:scheme="https" /> </intent-filter> </activity>
2. 重写onNewIntent处理新链接
设置singleTask后,新的链接Intent会发送到已存在的Activity实例,而不是创建新的。这时候你需要在onNewIntent里重新处理动态链接,不能只在onCreate里处理。
以Kotlin为例,在MainActivity中添加:
override fun onNewIntent(intent: Intent?) { super.onNewIntent(intent) setIntent(intent) // 更新当前Activity的Intent handleDynamicLink(intent) // 统一处理链接逻辑 } private fun handleDynamicLink(intent: Intent?) { Firebase.dynamicLinks .getDynamicLink(intent) .addOnSuccessListener { pendingLinkData -> pendingLinkData?.link?.let { deepLink -> // 这里写你的深度链接跳转逻辑,比如打开商品页、详情页 navigateToTargetPage(deepLink) } } .addOnFailureListener { error -> Log.w("DynamicLinkError", "获取链接失败", error) } }
记得在onCreate方法里也调用一次handleDynamicLink(intent),保证首次启动时也能处理链接。
3. 给动态链接添加包名参数(针对第三方应用适配)
有些应用(比如WhatsApp)会对链接做一层包装,可能导致唤起逻辑异常。你可以在创建动态链接时添加apn参数,明确指定应用包名,确保链接直接指向你的应用。
比如创建链接时带上:
https://你的动态链接域名.page.link/?link=https://你的应用域名/深层路径&apn=com.your.app.package
4. 验证唤起逻辑是否正常
用adb命令测试一下,看看Intent传递是否正确:
adb shell am start -a android.intent.action.VIEW -d "https://你的动态链接域名.page.link/测试链接"
如果测试时能直接唤起后台的应用实例,并触发onNewIntent,说明配置没问题;如果还是有问题,可能是第三方应用的特殊处理,这时候可以考虑在应用启动时(比如onResume)主动检查最近的动态链接:
override fun onResume() { super.onResume() Firebase.dynamicLinks .getDynamicLink(intent) .addOnSuccessListener { /* 处理逻辑 */ } }
如果是iOS端遇到类似问题,记得把Info.plist里的UIApplicationSupportsMultipleScenes设为NO,或者在SceneDelegate的scene(_:openURLContexts:)方法里处理动态链接。
内容的提问来源于stack exchange,提问作者Deepak

