为了让其他人也能够受益,我在这里发布我找到的解决方案。
最终其实很简单!在闪屏界面活动中,按照以下方式捕获pendingDynamicLinkData:
private fun decideNextDestination() {
FirebaseDynamicLinks.getInstance()
.getDynamicLink(intent)
.addOnSuccessListener(this) { pendingDynamicLinkData ->
val deepLink = pendingDynamicLinkData?.link
if (deepLink == null) navigateToMain() else deepLinkToDestination(deepLink)
}
.addOnFailureListener(this) { navigateToMain() }
}
然后在 deepLinkToDestination 方法中,构建一个 Intent,并添加一个包含 deeplink URI 的 bundle 以便传递(Android Uri 实现了 parcelable 接口,因此可以无问题地进行传递):
private fun deepLinkToDestination(deepLink: Uri) {
val bundle = Bundle().apply { putParcelable(DEEP_LINK_PARAM_KEY, deepLink) }
val intent = Intent(this, NavHostActivity::class.java).apply { putExtras(bundle) }
startActivity(intent)
finish()
}
然后在目标活动的onCreate中,获取深链接,将其转换为Uri并使用隐式深链接进行导航(请参阅文档https://developer.android.com/guide/navigation/navigation-deep-link#implicit)如下所示:
private fun handleDeepLink() {
val deepLink = intent.extras?.getParcelable(DEEP_LINK_PARAM_KEY) as? Uri
deepLink?.let { navController.safeNavigateToDeepLink(deepLink) }
}
我为NavController创建了一个扩展函数safeNavigateToDeepLink(deepLink),用于检查navGraph是否引用了该深链接(如导航组件源代码中建议的那样),如果找不到,则导航到默认目标:
fun NavController.safeNavigateToDeepLink(uri: Uri) {
if (graph.hasDeepLink(uri)) navigate(uri)
else safeNavigateTo(R.id.home)
}
如果对其他人有帮助,该函数库中的另一个扩展函数如下所示,它只是在导航之前检查是否可以找到导航到该目标的操作:
fun NavController.safeNavigateTo(id: Int) {
val action = currentDestination?.getAction(id)
action?.let { navigate(id) }
}