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

时间:2017-11-22 08:40:38

标签: android android-lifecycle

我在代码中发现了一个错误,我们正在启动该活动(让我们将其称为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()调用这么晚吗?如果是的话,我必须考虑解决方案。 如果没有,那么有什么地方可以修改吗?

非常感谢。

2 个答案:

答案 0 :(得分:10)

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

  

注意:不要指望将此方法称为保存位置   data!例如,如果某个活动正在编辑内容中的数据   提供者,这些编辑应该在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
    }
}

答案 1 :(得分:0)

使用处理程序,

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

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

onCreate
onStop
onDestroy
onCreate