在方向改变时调用onDestroy被调用?

时间:2014-01-03 01:20:54

标签: android android-activity

我有一台股票Nexus 5运行4.4.2(如果重要的话使用ART)我发现了一个有趣的场景。我将此作为我的onDestroy()

@Override
protected void onDestroy() {
    super.onDestroy();
    t.setText("onDestroy");
    t.show();
}

这是一款面向GPS的应用程序,所以我起身走动。我正在使用this question中提到的技术来显示许多调试Toast消息。

无论如何,当我旋转我的应用程序时,会出现吐司。我知道活动被破坏并为新方向重新创建,但我怎么知道实际发生了什么?如何判断我的应用程序何时被破坏而不仅仅是被轮换?与this question类似,我想在特定活动被销毁时注销。

4 个答案:

答案 0 :(得分:20)

自Honeycomb以来,可以查询isChangingConfigurations()方法以检查是否由于配置更改而重新创建Activity。或者,可以在任何API级别查询isFinishing()方法,以检查Activity是否实际完成,或者仅被系统暂时销毁。

据我所知,这两种方法应该总是在实践中返回相互一致的结果。他们可能分歧的唯一一点是系统杀死进程以清除内存,但此时没有回调或与应用程序的交互。

onDestroy()方法的documentation提到使用isFinishing()方法:

  

在销毁活动之前执行任何最终清理。这可能是因为活动正在完成(有人在其上调用finish(),或者因为系统暂时销毁此活动实例以节省空间。您可以使用isFinishing()来区分这两种情况方法

答案 1 :(得分:3)

您可以将其放入设置为setRetainInstanceState(true)的片段中。将代码放在片段的onDestroy()方法中。然后,在方向变化时不会破坏片段。

答案 2 :(得分:0)

首先,你不应该使用onDestroy()来做任何事情,因为它不能保证被调用。我会把东西放在onPause()方法上;我甚至不会把东西放在onStop()上。

另外,我不确定为什么要在用户离开应用时注销用户。我宁愿在应用程序或服务器上实现某种计时器,以便在x时间之后注销。

现在,答案在于文档:http://developer.android.com/reference/android/app/Activity.html#ConfigurationChanges

您可能希望覆盖onConfigurationChanged,以便不重新启动您的活动。

答案 3 :(得分:0)

我找到了几个解决方案,这些解决方案实际上只是在屏幕旋转时检测的模式。或者,您可以通过检查某些static data member来确定设备是否已被实际销毁,以查看它是否已初始化。

配置已更改解决方案:

第一个涉及处理configuration changes回调中的所有onConfigurationChanged

  

“请注意,只有在您选择时才会调用此选项   您想要使用configChanges处理的配置   清单中的属性。“

第二个涉及监听返回Display.getRotation()对象的Surface.ROTATION_*。哪个是屏幕相对于设备方向的自然状态的新方向。

同样,您可以将配置更改与静态成员一起使用。