我在代码中发现了一个错误,我们正在启动活动(让我们将其称为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()调用这么晚吗?如果是的话,我必须考虑解决方案。如果没有,那么有什么地方可以修改吗?
非常感谢。
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
}
}
使用Handler,
new Handler().postDelayed(new Runnable() {
@Override
public void run()
//enter code here for open an Activity
}
},300);
在那之后,我们得到的日志应该是:
onCreate
onStop
onDestroy
onCreate