从通知导航组件打开时避免片段重新创建

时间:2020-05-13 13:10:53

标签: notifications navigation fragment

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

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

我的情况是我有一个片段,当您退出应用程序时,会有一条通知,当您单击它时,它应该使您返回相同的片段。问题是每次单击它都会再次创建该片段,我不想重新创建。

1 个答案:

答案 0 :(得分:0)

我有同样的问题。似乎没有选择可以使用NavDeepLinkBuilder而不根据documentation

清除堆栈

我不确定您的操作的确切性质,但是我会做两个假设:

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