android 在活动重新创建后重置NavGraph

c9qzyr3d  于 2022-11-03  发布在  Android
关注(0)|答案(3)|浏览(236)

我有一个包含2个片段的导航图,片段A和片段B。片段A是我的起始目的地。
如果我在片段B中,打开应用设置,并撤销权限,我会看到:

  1. Activity被重新创建,但我没有看到调用了onDestory
    1.该活动不是从片段A开始,而是从片段B开始。
    我还看到应用程序被重新创建,并直接打开Activity B,而不是从Activity A开始(旧代码,我们的Activity很少)
    有没有办法重置导航图,使其从片段A开始?
  • 谢谢-谢谢
lawou6xi

lawou6xi1#

我最后是这样做的:在onCreate中:

savedInstanceState?.let {
        if (!ConfigChange) {
            val fragment: Fragment? =
                supportFragmentManager.findFragmentById(R.id.my_nav_host)
            fragment.let {
                if (it is NavHostFragment) {
                    it.navController.navigate(R.id.fragmentA)
                }
            }
        }
    }
zu0ti5jz

zu0ti5jz2#

此代码将在重新创建活动时重置导航图。

override fun onStart() {
    super.onStart()
    navController.setGraph(R.navigation.your_nav_graph)
}
arknldoa

arknldoa3#

遇到您的问题,正在寻找类似问题的答案。
在我的例子中,我有一个Activity应用,当权限状态改变时,它位于片段B中,并且在Activity重新启动后,它也会在片段B中重新打开。和您一样,我希望Activity从片段A开始,这也是导航图的起始位置或默认目标位置。
我解决这个问题的方法是,每当Activity由于REASON_PERMISSION_CHANGEexited 时,我都会进行检测,然后将Activity的onCreate()中的savedInstanceState设为无效。
下面是一些代码:

// MainActivity.kt
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(
            when (requiresPermissionChangeRestart()) {
                true -> {
                    Log.e(TAG "Resetting Activity after permissions manual change")
                    null
                }
                false -> {
                    savedInstanceState
                }
            }
        )
    }
...
    private fun requiresPermissionChangeRestart(): Boolean = (getSystemService(Context.ACTIVITY_SERVICE)
            as ActivityManager).let { am ->
        am.getHistoricalProcessExitReasons(null, 0, 0)
            .find {
                it.reason == ApplicationExitInfo.REASON_PERMISSION_CHANGE
            }
            .run {
                when (this != null) {
                    true -> {
                        Log.w(TAG, "Permissions for package $packageName where changed by the user")
                        true
                    }
                    false -> false
                }
            }
    }

}

这可能是一种技巧,但这个小技巧可能会帮助您找到更适合您的特定问题的解决方案。只要您在重要的时候从给定Activity中删除savedInstanceState,您就应该能够以您期望的方式 * 重新启动 * Activity。

相关问题