首页 > 解决方案 > 从通知导航组件打开时避免片段重新创建

问题描述

当我单击通知以打开片段而不是重新创建它时,我想要。我正在使用导航组件并使用 NavDeepLinkBuilder

 val pendingIntent = NavDeepLinkBuilder(this)
            .setComponentName(MainActivity::class.java)
            .setGraph(R.navigation.workouts_graph)
            .setDestination(R.id.workoutFragment)
            .createPendingIntent()

我的情况是我有一个片段,当你退出应用程序时,会有一个通知,当你点击它时,它应该让你回到同一个片段。问题是每次我点击它都会再次创建这个片段,我不想被重新创建。

标签: notificationsnavigationfragment

解决方案


我遇到过同样的问题。看起来没有根据文档在不清除堆栈的情况下使用 NavDeepLinkBuilder 的选项

我不确定你的行为的确切性质,但我会做出两个假设:

  1. 您将目标 ID 传递给 MainActivity 以进行导航。
  2. 您的 MainActivity 正在使用 ViewBinding 并且有一个 NavHostFragment

您将必须创建待处理的意图,例如:

val intent = Intent(this, MainActivity::class.java).apply {
            flags = Intent.FLAG_ACTIVITY_SINGLE_TOP
            putExtra("destination", R.id.workoutFragment)
}
val pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);

在您的 MainActivity 中,您可以处理这两种情况(应用程序已打开,应用程序尚未打开)

override fun onStart() {
    super.onStart()
    // called when application was not open
    intent?.let { processIntent(it) }
}

override fun onNewIntent(intent: Intent?) {
    super.onNewIntent(intent)
    // called when application was open
    intent?.let { processIntent(it) }
}

private fun processIntent(intent: Intent) {
    intent.extras?.getInt("destination")?.let {
        intent.removeExtra("destination")
        binding.navHostFragment.findNavController().navigate(it)
    }
}

推荐阅读