小编典典

为什么不总是使用 android:configChanges="keyboardHidden|orientation"?

all

我想知道为什么不在 android:configChanges="keyboardHidden|orientation"每个(几乎每个;))活动中使用?

商品:

  • 无需担心您的活动被轮换
  • 它更快

不太好:

  • 如果它们取决于屏幕大小,则需要更改布局(例如,具有两列左右的布局)

坏的:

  • 没有灵活的方式在不同的方向上有不同的布局
  • 使用片段时不太好

但是如果我们不使用不同的布局,为什么不呢?


阅读 58

收藏
2022-07-17

共1个答案

小编典典

快速背景

默认情况下,当 Android 上发生某些关键配置更改(常见示例是方向更改)时,Android 会完全重启正在运行的 Activity
以帮助其适应此类更改。

当您android:configChanges="keyboardHidden|orientation"在 AndroidManifest
中定义时,您是在告诉 Android:“请不要在拔出键盘或旋转手机时进行默认重置;我想自己处理。是的,我知道我在做什么”

这是一件好事吗?我们很快就会看到…

不用担心?

您开始的优点之一是:

无需担心您的活动被轮换

在许多情况下,人们错误地认为,当他们遇到由方向变化(“旋转”)产生的错误时,他们可以简单地通过输入android:configChanges="keyboardHidden|orientation".

然而, android:configChanges=”keyboardHidden|orientation”
只不过是一个创可贴。事实上,可以通过多种方式触发配置更改。例如,如果用户选择了一种新的语言(即区域设置已更改),您的活动将以与方向更改相同的方式重新启动。如果您愿意,您可以查看所有不同类型的配置更改的列表

编辑
:更重要的是,正如[在评论中指出的那样,当您的应用程序在后台并且
Android 决定通过杀死它来释放一些内存时,您的活动也将重新启动。当用户返回您的应用程序时,Android 将尝试重新启动
Activity,就像发生其他一些配置更改时一样。如果你不能处理 - 用户将不高兴......

换句话说,使用android:configChanges="keyboardHidden|orientation"并不能解决您的“担忧”。正确的方法是对您的活动进行编码,以便他们对
Android 向他们抛出的任何重启感到满意。这是一个很好的做法,可以帮助你走上这条路,所以要习惯它。

那么我应该什么时候使用它呢?

正如你提到的,有一个明显的优势。通过自己处理来覆盖轮换的默认配置更改将加快速度。然而,这种速度确实以便利为代价。

简而言之,如果您对纵向和横向都使用相同的布局,则通过覆盖您处于良好状态。视图不会完全重新加载活动,而是会简单地移动以填充剩余空间。

但是 ,如果由于某种原因您在设备处于横向时使用了不同的布局,Android 重新加载您的 Activity
的事实很好,因为它将加载正确的布局。[如果您在这样的 Activity 上使用覆盖,并且想在运行时进行一些神奇的重新布局......好吧,祝你好运 -
这远非简单]

快速总结

无论如何,如果android:configChanges="keyboardHidden|orientation"适合您,请使用它。但是
务必测试发生变化时会发生什么,因为方向变化并不是触发完全 Activity 重启的唯一方式。

2022-07-17