【问题标题】:Getting around onDestroy being called on orientation change?在方向改变时调用 onDestroy?
【发布时间】:2014-01-03 01:20:54
【问题描述】:

我有一个运行 4.4.2 的库存 Nexus 5(如果需要,使用 ART),我发现了一个有趣的场景。我有这个作为我的onDestroy()

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

这是一个面向 GPS 的应用程序,所以我起身四处走动。我正在使用this question 中提到的技术来显示大量调试 toast 消息。

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

【问题讨论】:

    标签: android android-activity


    【解决方案1】:

    您可以将其放入带有setRetainInstanceState(true) 集的片段中。将您的代码放在片段的onDestroy() 方法中。然后,该片段不会在方向更改时被破坏。

    【讨论】:

      【解决方案2】:

      由于Honeycomb,可以通过isChangingConfigurations()方法查询Activity是否因为配置改变而被重新创建。或者,可以在任何 API 级别上查询 isFinishing() 方法,以检查 Activity 是否真的正在完成,或者只是被系统暂时销毁。

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

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

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

      【讨论】:

      • 按下后退按钮时,应用程序是否仍在“完成”?因为我实际上并没有打电话给.finish()
      • @CoreyOgburn:是的,是的;框架从onBackPressed() 回调实现中调用finish()
      【解决方案3】:

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

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

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

      您可能想要覆盖 onConfigurationChanged 以便您的活动不会重新启动。

      【讨论】:

      • 我正在将两个设备配对在一起。当一个用户关闭他们的应用程序时,我希望另一个用户也从会话中删除。最简单的方法是终止共享会话。
      【解决方案4】:

      我发现了一些解决方案,它们实际上只是检测屏幕何时旋转的模式。或者,您可以通过检查一些static data member 来确定该设备实际上已被销毁,以查看它是否已初始化。

      配置改变解决方案:

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

      "请注意,只有在您选择了 您想使用 configChanges 处理的配置 清单中的属性。”

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

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

      【讨论】:

        【解决方案5】:

        将 ConfigChanges.UiMode 标志添加到 MainActivity 类的 ConfigurationChanges 属性,这样就解决了问题。

        更多详情:Android Launcher "OnDestroy" gets called twice

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多