我在我们的代码中发现了一个bug,我们正在通过

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()将触发一个新的screenacivity oncreate()。问题是screenmanager类保留创建和销毁的活动的标志。
该标志在oncreate()回调和ondestroy()回调时设置。
所以对于10555和13701行,screenmanager设置createflag=true。对于第13799行,将createFlag设置为false。
事件发生在第13799行之后,该行将假定活动未创建且事件未通知给该活动。
希望我对这个问题的描述对你是清楚的。
这种场景onstop()和ondestroy()调用在调用finish()之后会这么晚吗?如果是的话,我得考虑一下解决办法。
如果没有,那么有什么地方可以修改吗?
谢谢。

最佳答案

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
    }
}

07-28 02:33
查看更多