利用Android导航组件通过启动屏幕活动处理深层链接

时间:2019-09-10 21:40:00

标签: android navigation components splash-screen deep-linking

我有一个包含两个活动的应用程序,一个启动屏幕活动,另一个包含该应用程序的主导航图。

我想利用Android导航组件随附的新的深层链接处理功能。但是,按照Google教程进行操作后,单击链接时将跳过“启动”屏幕,并直接进入该应用的导航图。

有什么方法可以使用这些新功能,同时仍然要在引导至应用程序的正确部分之前强制首先显示启动屏幕?

1 个答案:

答案 0 :(得分:3)

在其他人有相同要求的情况下,张贴我来到这里的解决方案。

最后实际上很简单!在初始屏幕活动中,捕获如下的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方法中,构建一个意图并添加带有要传递的Deeplink URI的捆绑包(Android Uri实现了可打包,因此可以顺利通过):

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) }
}