升级Navigation组件至2.7.7后自动销毁Activity触发IllegalStateException
我们的应用具备自动登出机制,超时后会销毁托管Fragment的Activity并启动Logout Activity(重定向至登录页)。
场景对比
- 场景1(无异常):使用
navigation-fragment与navigation-ui2.3.5版本时,在任意Fragment页面触发超时销毁Activity,均无异常问题。 - 场景2(触发致命异常):升级至
navigation-fragment、navigation-ui2.7.7版本(曾添加navigation-compose:2.7.7,后移除)后,超时销毁Activity时触发如下异常:
FATAL EXCEPTION: main Process: appId.uat, PID: 2152 java.lang.RuntimeException: Unable to destroy activity {appId.uat/*.activity.DashBoardActivity}: java.lang.IllegalStateException: no event down from INITIALIZED in component NavBackStackEntry(1dfeaea1-7bd0-413f-9495-63e344e82742) destination=Destination(appId.uat:id/fragmentWeAreOn) label=FragmentWeAreOn class=*.FragmentWeAreOn at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:5613) at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:5645) at android.app.servertransaction.DestroyActivityItem.execute(DestroyActivityItem.java:47) at android.app.servertransaction.ActivityTransactionItem.execute(ActivityTransactionItem.java:45) at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:180) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:98) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2443) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loopOnce(Looper.java:205) at android.os.Looper.loop(Looper.java:294) at android.app.ActivityThread.main(ActivityThread.java:8177) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:971) Caused by: java.lang.IllegalStateException: no event down from INITIALIZED in component NavBackStackEntry(1dfeaea1-7bd0-413f-9495-63e344e82742) destination=Destination(appId.uat:id/fragmentWeAreOn) label=FragmentWeAreOn class=*.FragmentWeAreOn at androidx.lifecycle.LifecycleRegistry.moveToState(LifecycleRegistry.kt:126) at androidx.lifecycle.LifecycleRegistry.setCurrentState(LifecycleRegistry.kt:106) at androidx.navigation.NavBackStackEntry.updateState(NavBackStackEntry.kt:186) at androidx.navigation.NavBackStackEntry.handleLifecycleEvent(NavBackStackEntry.kt:166) at androidx.navigation.NavController.lifecycleObserver$lambda$2(NavController.kt:190) at androidx.navigation.NavController.$r8$lambda$bZL_fnLbLD5ZZthGK_6aY8AQ2pA(Unknown Source:0) at androidx.navigation.NavController$$ExternalSyntheticLambda0.onStateChanged(Unknown Source:2) at androidx.lifecycle.LifecycleRegistry$ObserverWithState.dispatchEvent(LifecycleRegistry.kt:314) at androidx.lifecycle.LifecycleRegistry.backwardPass(LifecycleRegistry.kt:266) at androidx.lifecycle.LifecycleRegistry.sync(LifecycleRegistry.kt:283) at androidx.lifecycle.LifecycleRegistry.moveToState(LifecycleRegistry.kt:136) at androidx.lifecycle.LifecycleRegistry.handleLifecycleEvent(LifecycleRegistry.kt:119) at androidx.fragment.app.Fragment.performDestroy(Fragment.java:3372) at androidx.fragment.app.FragmentStateManager.destroy(FragmentStateManager.java:812) at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:346) at androidx.fragment.app.SpecialEffectsController$FragmentStateManagerOperation.complete(SpecialEffectsController.kt:664) at androidx.fragment.app.SpecialEffectsController$Operation.cancel(SpecialEffectsController.kt:507) at androidx.fragment.app.SpecialEffectsController.forceCompleteAllOperations(SpecialEffectsController.kt:293) at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:3037) at androidx.fragment.app.FragmentManager.dispatchDestroy(FragmentManager.java:2988) at androidx.fragment.app.FragmentController.dispatchDestroy(FragmentController.java:346) at androidx.fragment.app.FragmentActivity.onDestroy(FragmentActivity.java:258) at androidx.appcompat.app.AppCompatActivity.onDestroy(AppCompatActivity.java:283) at android.app.Activity.performDestroy(Activity.java:8876) 2024-06-03 19:44:13.821 2152-2152 AndroidRuntime appId.uat E at android.app.Instrumentation.callActivityOnDestroy(Instrumentation.java:1491) at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:5600) ... 13 more 2024-06-03 19:44:18.378 2152-2152 FirebaseCrashlytics appId.uat E Cannot send reports. Timed out while fetching settings.
经测试,移除androidx.navigation:navigation-compose与androidx.lifecycle:lifecycle-runtime-compose后问题仍存在,确认是从2.3.5升级至2.7.7版本导致。且该异常仅在导航栈第2层及以后页面销毁Activity时触发,起始页无此问题。尝试过多种依赖组合均未解决,恳请有相关经验的开发者提供帮助。
内容的提问来源于stack exchange,提问作者Suyash Chavan
相关产品推荐
相关产品推荐

