Android - 在暂停活动后 onResume() 之前调用 onConfigurationChanged()

Tim*_*mos 5 android

在我的活动中,我在播放视频时覆盖了 onConfigurationChanged() 方法,并且我不想等待一秒钟,直到系统再次准备好在我更改设备方向后继续播放视频。这工作得很好 - 我的视频一直在流畅播放,方向也发生了变化,而视频会重新缩放以适应屏幕尺寸。

然而,当采取这些步骤时,我发现了一个错误:

  1. 我在视频播放期间暂停了我的应用
  2. 我改变方向
  3. 我“恢复”我的应用

发生的第一件事是: onConfigurationChanged() 被调用,而不是 onResume() 之后我的所有字段都应该被恢复!这会导致一个异常,其原因是除以零 - 某些字段等于 0,因为它尚未恢复。当然,这不是我们想要的行为。我的应用程序在以暂停的相同方向恢复时确实有效。

不过,我可以通过使用指示我的 Activity 是否已“完全加载”的布尔值来规避这一点——也就是说,已经调用了 onResume() 方法。但我认为这不是一个非常干净的解决方案。

我的问题是:

  1. 这是预期的行为吗?我认为 onConfigurationChanged() 在 onResume() 之前被调用很奇怪。这是一个错误吗?
  2. 我能否以编程方式“取消注册”我的应用程序,使其暂时不监听 onConfigurationChanged()(例如,在 onPause() 方法中取消注册)?由于此方法不会被调用,因为您必须为其注册一些侦听器,但会因为您在 AndroidManifest.xml 文件中放入以下行而被调用:

    android:configChanges="方向"

Mah*_*raa 1

1-答案在http://developer.android.com/reference/android/app/Activity.html

在某些特殊情况下,您可能希望根据一种或多种类型的配置更改绕过 Activity 的重新启动。这是通过其清单中的 android:configChanges 属性完成的。对于您所说的在那里处理的任何类型的配置更改,您将收到对当前活动的 onConfigurationChanged(Configuration) 方法的调用,而不是重新启动。但是,如果配置更改涉及您不处理的任何配置更改,则该活动仍将重新启动并且不会调用 onConfigurationChanged(Configuration)。

因此,提前调用 onconfigurationchanged 以允许在再次开始活动之前进行更改是正常的。2-我对此不确定。

  • 这不是我问题的答案。我知道如果我的应用程序正在运行并且我重写了 onConfigurationChanged(),则 onResume() 不会被调用。这个问题是在我的应用程序暂停时方向发生变化的上下文中提出的 - 因此,应该在恢复时调用 onResume() 。它确实被调用,但不是在 onConfigurationChanged() 之前调用,这就是问题所在。我已经浏览了您提供的文档,因此这并不能启发我,但无论如何还是谢谢。 (2认同)