gpt4 book ai didi

android - onStop 在 onDestroy 之后被调用?

转载 作者:行者123 更新时间:2023-12-03 13:25:45 24 4
gpt4 key购买 nike

我遇到了Activity 的一个相当奇怪的问题。生命周期。

短前传:

我发现的第一个症状是它崩溃了 IllegalArgumentException当我试图在 onStop 中注销接收器时在 onStart 注册后.

在转储 Activity 接收器的完整列表(一些反射魔法)之后,我发现我的接收器不在列表中。它要么被错误地移到其他地方,要么在 onDestroy 期间被移走。调用Activity在哪里 Context正在清理(在 onDestroy ActivityThread 期间调用 ContextImpl#performFinalCleanup ,然后调用 LoadedApk#removeContextRegistrations )。

怎么了?

在向崩溃添加更多分析信息后,我发现崩溃发生在 onStop , Activity处于一个非常奇怪的状态 - 它是 isDestroyed()通话返回 true ,它是 isFinishing()返回 false , 它是 getLifecycle().getCurrentState()返回 DESTROYED ...

检测正常onStop() (没有崩溃)调用显示 Activity处于这种状态:
isDestroyed()false , 和 getLifecycle().getCurrentState()CREATEDonStop .

所以我得出的结论是onStoponDestroy 之后被调用,我认为这是不可能的,但它似乎发生了。

onStop绝对不会被应用程序中的其他东西手动调用,因为这是 onStop 所在位置的堆栈跟踪被称为从。

com.myapp.TheActivity.onStop (TheActivity.java:217)
android.app.Instrumentation.callActivityOnStop (Instrumentation.java:1474)
android.app.Activity.performStop (Activity.java:8189)
android.app.ActivityThread.callActivityOnStop (ActivityThread.java:4994)
android.app.ActivityThread.performStopActivityInner (ActivityThread.java:4967)
android.app.ActivityThread.handleStopActivity (ActivityThread.java:5047)
android.app.servertransaction.TransactionExecutor.performLifecycleSequence (TransactionExecutor.java:233)
android.app.servertransaction.TransactionExecutor.cycleToPath (TransactionExecutor.java:201)
android.app.servertransaction.TransactionExecutor.executeLifecycleState (TransactionExecutor.java:173)
android.app.servertransaction.TransactionExecutor.execute (TransactionExecutor.java:97)
android.app.ActivityThread$H.handleMessage (ActivityThread.java:2220)
android.os.Handler.dispatchMessage (Handler.java:107)
android.os.Looper.loop (Looper.java:237)
android.app.ActivityThread.main (ActivityThread.java:8016)
java.lang.reflect.Method.invoke (Method.java)
com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:493)
com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1076)

最佳答案

原因尚不清楚,但最近越来越受到关注。它发生在 onResume/onPause 和 onStart/onStop 对中调用注册/取消注册。关于这些生命周期检查,请确保您拥有带有 hashCode() 或其他东西的 Activity 实例。无论如何,要解决此问题,最佳做法是将注册/取消注册调用包装在 try/catch block 中:

private void registerBroadcastReceiver() {
try {
appUpdateReceiver = new AppUpdateReceiver();
registerReceiver(appUpdateReceiver, appUpdateIntentFilter);
} catch (IllegalArgumentException e) {
// already registered
}

}

private void unregisterBroadcastReceiver() {
try {
unregisterReceiver(appUpdateReceiver);
} catch (IllegalArgumentException e) {
// already unregistered
}
}

关于android - onStop 在 onDestroy 之后被调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62424554/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com