繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM