我有一台股票Nexus 5运行4.4.2(如果重要的话使用ART)我发现了一个有趣的场景。我将此作为我的onDestroy()
:
@Override
protected void onDestroy() {
super.onDestroy();
t.setText("onDestroy");
t.show();
}
这是一款面向GPS的应用程序,所以我起身走动。我正在使用this question中提到的技术来显示许多调试Toast消息。
无论如何,当我旋转我的应用程序时,会出现吐司。我知道活动被破坏并为新方向重新创建,但我怎么知道实际发生了什么?如何判断我的应用程序何时被破坏而不仅仅是被轮换?与this question类似,我想在特定活动被销毁时注销。
答案 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_*。哪个是屏幕相对于设备方向的自然状态的新方向。
同样,您可以将配置更改与静态成员一起使用。