【问题标题】:Android configChanges for orientationAndroid configChanges 方向
【发布时间】:2019-04-04 06:05:54
【问题描述】:

我需要防止在用户改变方向时重新启动activity,所以我需要设置:

android:configChanges="orientation"

但是在文档中,有一个关于方向的注释,

注意:如果您的应用程序面向 Android 3.2(API 级别 13)或 更高,那么您还应该声明“screenSize”配置, 因为当设备在纵向和纵向之间切换时它也会发生变化 横向。

我有点害怕与 screenSize 一起使用,因为我只需要它来定位。

我想知道 screenSize 事件什么时候发生?

我将 'orientation|screenSize' 一起设置并通过更改设备的字体大小进行测试,但 screenSize 没有更改,因此已重新加载活动。

何时(在什么情况下)调用 screenSize 事件?如果我将 screenSize 设置为 configChanges 会有任何副作用吗?

【问题讨论】:

  • 在不知道为什么需要这种行为的情况下:请注意,活动不仅可以通过方向更改来重新启动。通常,试图阻止活动重新启动是不好的形式。您应该以可以随时重新启动活动的方式设计您的应用程序。 Android 开发者文档中有 some good tips 说明如何处理这个问题。
  • 我明白这不是好的形式。但我想知道有没有已知的副作用?在设置之前我可以测试什么?

标签: android


【解决方案1】:

我为此查看了 Android 源代码。有趣的部分在ActivityRecord 方法crossesSizeThresholdgetConfigurationChanges 中。 screenSize 事件发生在屏幕尺寸发生变化并且该变化可能对应用程序“重要”时。那么“重要”是什么意思:

当应用发生屏幕大小调整时,Android 会尝试决定是否需要重新启动 Activity。如果尺寸变化很小,重新布局活动内容可能就足够了,而对于更大的尺寸变化,则需要进行完整的配置更改。

为了决定是否必须更改配置,Android 会收集应用的大小敏感资源限定符(例如 layout-h400dp)。如果调整大小跨越限定符边界,则会发生配置更改,而如果调整大小未跨越边界,则保留活动并且仅执行重新布局。

话虽如此,我还是试图重现这种行为。我无法得出结论性的测试,因为在调整大小期间也发生了其他 configChanges 事件。

我最初的观点仍然成立。很难预测配置更改可能发生的所有可能原因,并且试图阻止重新创建活动非常困难。尤其是我们今天拥有的大量 API 版本和设备模型。将业务逻辑和状态与 UI 层分离的架构良好的应用程序仍然是要走的路。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-28
    • 2021-12-07
    • 1970-01-01
    • 1970-01-01
    • 2012-10-26
    相关资源
    最近更新 更多