【问题标题】:Avoid fragment recreation when opening from notification navigation component从通知导航组件打开时避免片段重新创建
【发布时间】:2020-05-13 13:10:53
【问题描述】:

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

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

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

【问题讨论】:

    标签: notifications navigation fragment


    【解决方案1】:

    我有同样的问题。根据documentation

    ,看起来没有在不清除堆栈的情况下使用 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)
        }
    }
    

    【讨论】:

    • 不幸的是,这仍在创建一个新片段,因为您正在从 MainActivity 导航到 WorkoutFragment。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-14
    • 2019-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    相关资源
    最近更新 更多