![](/img/trans.png)
[英]Android Fragment onDestroy called twice during a orientation change
[英]Getting around onDestroy being called on orientation change?
我有一个运行4.4.2的股票Nexus 5(如果重要的话使用ART),我发现了一个有趣的场景。 我有这个作为我的onDestroy()
:
@Override
protected void onDestroy() {
super.onDestroy();
t.setText("onDestroy");
t.show();
}
这是一个面向GPS的应用程序,所以我起来走动。 我正在使用此问题中提到的技术来显示许多调试Toast消息。
无论如何,当我旋转我的应用程序时,会出现吐司。 我知道活动被破坏并为新方向重新创建,但我怎么知道实际发生了什么? 如何判断我的应用程序何时被破坏而不仅仅是被轮换? 与此问题类似,我想在特定活动被销毁时注销。
从Honeycomb开始,可以查询isChangingConfigurations()
方法以检查是否由于配置更改而重新创建了Activity
。 或者,可以在任何API级别查询isFinishing()
方法,以检查Activity
是否实际完成,或者仅由系统临时销毁。
据我所知,这两种方法应该总是在实践中返回相互一致的结果。 它们可能分歧的唯一一点是系统杀死进程以清除内存,但此时没有回调或与应用程序的交互。
onDestroy()
方法的文档提到了isFinishing()
方法的用法:
在销毁活动之前执行任何最终清理。 这可能是因为活动正在完成(有人称为
finish()
,或者因为系统暂时销毁此活动实例以节省空间。您可以使用isFinishing()
方法区分这两种情况。
您可以将其放入设置了setRetainInstanceState(true)
的片段中。 将代码放在片段的onDestroy()
方法中。 然后,在方向变化时不会破坏片段。
首先,你不应该使用onDestroy()来做任何事情,因为它不能保证被调用。 我会把东西放在onPause()方法上; 我甚至不会把东西放在onStop()上。
另外,我不确定为什么要在用户离开应用程序时注销用户。 我宁愿在应用程序或服务器上实现某种计时器,以便在x时间之后注销。
现在,答案在于文档: http : //developer.android.com/reference/android/app/Activity.html#ConfigurationChanges
您可能希望覆盖onConfigurationChanged,以便不重新启动您的活动。
我找到了几个解决方案,它们实际上只是在屏幕旋转时检测的模式。 或者,您可以通过检查某个静态数据成员来确定是否实际销毁了该设备,以查看它是否已初始化。
配置更改解决方案
第一个涉及处理onConfigurationChanged回调中的所有配置更改 。
“请注意,只有在清单中选择了要使用configChanges属性处理的配置时,才会调用此选项。”
第二个涉及侦听Display.getRotation() ,它返回一个Surface.ROTATION_ *对象。 这是屏幕相对于设备方向的自然状态的新方向。
同样,您可以将配置更改与静态成员一起使用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.