重新创建活动后,super.onCreatesavedInstanceState崩溃

问题描述

我在项目ActivityOneMainActivity中有两项活动。 我使用MainActivity中的意图开始ActivityOne,然后在MainActivity中切换暗模式开关,并在活动中调用recreate()。 但是MainActivity在重新创建时在super.onCreate(savedInstanceState)行崩溃。

androidx片段版本:1.2.5

生命周期版本:2.2.0

MainActivity:

override fun onCreate(savedInstanceState: Bundle?) {
        val userInterfaceMode = when (UIMode.currentUIMode) {
            is UIMode.DarkMode -> AppCompatDelegate.MODE_NIGHT_YES
            is UIMode.lightmode -> AppCompatDelegate.MODE_NIGHT_NO
            else -> AppCompatDelegate.MODE_NIGHT_FOLLOW_SYstem
        }
        AppCompatDelegate.setDefaultNightMode(userInterfaceMode)
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        overridePendingTransition(
            R.anim.enter_activity_fade_in_anim,R.anim.enter_activity_fade_out_anim
        )
        if (savedInstanceState == null){
            setupNavigation()
        }
    }

    override fun onRestoreInstanceState(savedInstanceState: Bundle) {
        super.onRestoreInstanceState(savedInstanceState)
        setupNavigation()
    }

    private fun setupNavigation(){
        if (supportFragmentManager.findFragmentByTag(NAV_HOST_TAG) != null){
            val host = supportFragmentManager
                .findFragmentByTag(NAV_HOST_TAG) as NavHostFragment
            supportFragmentManager
                .beginTransaction()
                .attach(host)
                .setPrimaryNavigationFragment(host)
                .commit()
        }else{
            val host = NavHostFragment.create(R.navigation.navigation_graph)
            supportFragmentManager
                .beginTransaction()
                .add(
                    R.id.mainActivityRoot,host,NAV_HOST_TAG
                )
                .setPrimaryNavigationFragment(host)
                .commit()
        }
    }

Logcat:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: me.pitok.goodnews,PID: 6173
    java.lang.RuntimeException: Unable to start activity ComponentInfo{MainActivity}: java.lang.IllegalArgumentException
        at android.app.ActivityThread.performlaunchActivity(ActivityThread.java:2984)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3119)
        at android.app.ActivityThread.handlerelaunchActivityInner(ActivityThread.java:4886)
        at android.app.ActivityThread.handlerelaunchActivity(ActivityThread.java:4795)
        at android.app.servertransaction.ActivityrelaunchItem.execute(ActivityrelaunchItem.java:69)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
        at android.app.ClientTransactionHandler.executeTransaction(ClientTransactionHandler.java:55)
        at android.app.ActivityThread.handlerelaunchActivityLocally(ActivityThread.java:4845)
        at android.app.ActivityThread.access$3300(ActivityThread.java:201)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1849)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:201)
        at android.app.ActivityThread.main(ActivityThread.java:6864)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:873)
     Caused by: java.lang.IllegalArgumentException
        at androidx.lifecycle.LifecycleRegistry.downEvent(LifecycleRegistry.java:263)
        at androidx.lifecycle.LifecycleRegistry.backwardPass(LifecycleRegistry.java:314)
        at androidx.lifecycle.LifecycleRegistry.sync(LifecycleRegistry.java:334)
        at androidx.lifecycle.LifecycleRegistry.movetoState(LifecycleRegistry.java:145)
        at androidx.lifecycle.LifecycleRegistry.setCurrentState(LifecycleRegistry.java:118)
        at androidx.navigation.NavBackStackEntry.updateState(NavBackStackEntry.java:150)
        at androidx.navigation.NavBackStackEntry.setMaxLifecycle(NavBackStackEntry.java:130)
        at androidx.navigation.NavController.popBackStackInternal(NavController.java:325)
        at androidx.navigation.NavController.dispatchOnDestinationChanged(NavController.java:426)
        at androidx.navigation.NavController.onGraphCreated(NavController.java:636)
        at androidx.navigation.NavController.setGraph(NavController.java:586)
        at androidx.navigation.NavController.setGraph(NavController.java:551)
        at androidx.navigation.fragment.NavHostFragment.onCreate(NavHostFragment.java:247)
        at androidx.fragment.app.Fragment.performCreate(Fragment.java:2685)
        at androidx.fragment.app.FragmentStateManager.create(FragmentStateManager.java:280)
        at androidx.fragment.app.FragmentManager.movetoState(FragmentManager.java:1187)
        at androidx.fragment.app.FragmentManager.movetoState(FragmentManager.java:1368)
        at androidx.fragment.app.FragmentManager.moveFragmentToExpectedState(FragmentManager.java:1446)
        at androidx.fragment.app.FragmentManager.movetoState(FragmentManager.java:1509)
        at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2637)
        at androidx.fragment.app.FragmentManager.dispatchCreate(FragmentManager.java:2583)
        at androidx.fragment.app.FragmentController.dispatchCreate(FragmentController.java:236)
        at androidx.fragment.app.FragmentActivity.onCreate(FragmentActivity.java:315)
        at androidx.appcompat.app.AppCompatActivity.onCreate(AppCompatActivity.java:115)
        at me.pitok.goodnews.appMain.MainActivity.onCreate(MainActivity.kt:24)
        at android.app.Activity.performCreate(Activity.java:7232)
        at android.app.Activity.performCreate(Activity.java:7221)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1272)
        at android.app.ActivityThread.performlaunchActivity(ActivityThread.java:2964)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3119) 
        at android.app.ActivityThread.handlerelaunchActivityInner(ActivityThread.java:4886) 
        at android.app.ActivityThread.handlerelaunchActivity(ActivityThread.java:4795) 
        at android.app.servertransaction.ActivityrelaunchItem.execute(ActivityrelaunchItem.java:69) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68) 
        at android.app.ClientTransactionHandler.executeTransaction(ClientTransactionHandler.java:55) 
        at android.app.ActivityThread.handlerelaunchActivityLocally(ActivityThread.java:4845) 
        at android.app.ActivityThread.access$3300(ActivityThread.java:201) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1849) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loop(Looper.java:201) 
        at android.app.ActivityThread.main(ActivityThread.java:6864) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:873) 

解决方法

使用导航图和目标的相同ID似乎是个问题。

https://issuetracker.google.com/issues/161825212

我们发生了非常类似的崩溃,并通过为导航图使用唯一的ID来解决了该问题。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...