使用Android Navigation组件处理带有闪屏活动的深度链接。

7
我有一个应用程序,包含两个活动:闪屏活动和包含应用程序主导航图的另一个活动。
我想利用 Android 导航组件提供的新深度链接处理功能。但是按照 Google 的教程进行操作后,当点击链接时会跳过闪屏页面,直接进入应用程序的 navgraph。
有没有办法在导航到应用程序的正确部分之前,仍然强制显示闪屏页面并使用这些新功能呢?

您是否要在应用程序的正确部分之前显示启动画面(使用导航组件)? - Geekfreak
感谢您的回复@HemantSharma。需求是先显示启动屏幕(不带导航组件),然后将深度链接传递给具有导航组件的主要活动。最终找到了解决方案(请参见下面的帖子)。 - dev2505
1个回答

15

为了让其他人也能够受益,我在这里发布我找到的解决方案。

最终其实很简单!在闪屏界面活动中,按照以下方式捕获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) }
}

1
那么在同样的情况下,如何进行显式深度链接? - Upendra Shah
这样的话,您需要在启动活动的清单中手动声明意图过滤器,对吗?因为 <nav-graph android:value="@navigation/nav_graph" /> 无法工作。 - JacksOnF1re
pendingDynamicLinkData 一直为 null,有什么想法吗? - Moustafa EL-Saghier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接