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