利用 Android 导航组件处理带有启动画面的深层链接 activity
Utilise Android Navigation component to handle deep links with a splash screen activity
我有一个包含两个活动的应用程序,一个启动画面 activity 另一个包含应用程序的主导航图。
我想利用 Android 导航组件附带的新深度 linking 处理。但是,按照 Google 教程,单击 link 时会跳过初始屏幕并直接进入应用程序的导航图。
有没有什么方法可以使用这些新功能,同时仍然强制在导航到应用程序的正确部分之前先显示初始屏幕?
张贴我来到这里的解决方案,以防其他人有相同的要求。
其实最后还是很简单的!在初始屏幕 activity 中,捕捉 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 实现了 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()
}
然后在目标 activity 的 onCreate 中,获取深度 link,转换为 Uri 并使用隐式深度 links 导航(参见文档 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 是否引用了那个深度 link(如导航组件源代码中所建议),然后如果不能找到,导航到默认目的地:
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) }
}
我有一个包含两个活动的应用程序,一个启动画面 activity 另一个包含应用程序的主导航图。
我想利用 Android 导航组件附带的新深度 linking 处理。但是,按照 Google 教程,单击 link 时会跳过初始屏幕并直接进入应用程序的导航图。
有没有什么方法可以使用这些新功能,同时仍然强制在导航到应用程序的正确部分之前先显示初始屏幕?
张贴我来到这里的解决方案,以防其他人有相同的要求。
其实最后还是很简单的!在初始屏幕 activity 中,捕捉 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 实现了 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()
}
然后在目标 activity 的 onCreate 中,获取深度 link,转换为 Uri 并使用隐式深度 links 导航(参见文档 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 是否引用了那个深度 link(如导航组件源代码中所建议),然后如果不能找到,导航到默认目的地:
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) }
}