activity完成了自己,但onDestroy()调用此活动发生得太晚了

问题描述 投票:1回答:2

我在代码中发现了一个错误,我们正在启动活动(让我们将其称为SCREEN_ACTIVITY)

Intent intent = new Intent(SharedIntents.INTENT_SCREEN);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);

Android文档:使用FLAG_ACTIVITY_NEW_TASK时,如果任务已在您正在启动的活动上运行,则不会启动新活动;相反,当前任务将简单地以最后一个状态被带到屏幕的前面。

所以在大多数情况下一切正常。

当用户点击某些内容时,该屏幕活动将调用finish()。此屏幕活动也将通过服务的传入事件启动或创建。

6053 I/ScreenActivity(15395): onCreate
6682 E/ScreenActivity(15395): finish() Activity
6832 I/ScreenActivity(15395): onDestroy

7284 I/ScreenActivity(15395): onCreate
7911 E/ScreenActivity(15395): finish() Activity
8063 I/ScreenActivity(15395): onDestroy

10555 I/ScreenActivity(15395): onCreate
13413 E/ScreenActivity(15395): finish() Activity
13701 I/ScreenActivity(15395): onCreate
13799 I/ScreenActivity(15395): onDestroy

最后一个是问题。创建ScreenActivity,然后调用finish()本身。但问题是onDestroy被称为很晚。在此之前,来自服务器的传入事件和调用startActivity()会触发一个新的ScreenAcitivty onCreate()。问题是ScreenManager类保留了创建和销毁该活动的标志。

在onCreate()回调和onDestroy()回调时设置该标志。因此,对于第10555行和第13701行,ScreenManager设置createFlag = true。对于13799行,设置createFlag = false。在13799行假设未创建活动且未向活动通知事件之后,事件发生。

希望我对此问题的描述清楚。调用finish()后会发生这种情况onStop()和onDestroy()调用这么晚吗?如果是的话,我必须考虑解决方案。如果没有,那么有什么地方可以修改吗?

非常感谢。

android android-lifecycle
2个回答
11
投票

onDestroy()可能会或可能不会被召唤。你不能一直依赖它。来自docs

注意:不要指望这种方法被称为保存数据的地方!例如,如果某个活动正在编辑内容提供程序中的数据,那么这些编辑应该在onPause()或onSaveInstanceState(Bundle)中提交,而不是在此处。通常实现此方法是为了释放与活动相关联的线程之类的资源,以便在其应用程序的其余部分仍在运行时,被破坏的活动不会留下这些东西。在某些情况下,系统会简单地杀死活动的托管进程,而不会在其中调用此方法(或任何其他方法),因此它不应该用于执行在进程消失后保留的内容。

如果你需要知道你的Activity正在完成,一个可靠的方法来了解它是否正在完成是isFinishing()方法。你可以在onPause()中调用它,看看这个停顿是否会最终导致这个Activity被摧毁:

@Override
protected void onPause() {
    super.onPause();
    if (isFinishing()) {
        // Here  you can be sure the Activity will be destroyed eventually
    }
}

0
投票

使用Handler,

 new Handler().postDelayed(new Runnable() {
            @Override
            public void run() 
              //enter code here for open an Activity
            }
        },300);

在那之后,我们得到的日志应该是:

onCreate
onStop
onDestroy
onCreate 
© www.soinside.com 2019 - 2024. All rights reserved.