我在想,为什么不在每次(几乎每一次)活动中都使用android:configChanges="keyboardHidden|orientation"次呢?

Cargo :

  • 不用担心你的活动被轮换了
  • 更快

不是很好:

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

不好的:

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

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

推荐答案

快速背景

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

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

这是好事吗?我们很快就会看到...

别担心?

你一开始的优点之一是:

不用担心你的活动被轮换了

在许多情况下,人们错误地认为,当他们有一个由方向改变("旋转")产生的错误时,他们只需输入android:configChanges="keyboardHidden|orientation"就可以解决它.

然而,android:configChanges="keyboardHidden | orientation"不过是一张绷带.事实上,有很多方式可以触发配置更改.例如,如果用户 Select 了一种新的语言(即语言环境已更改),您的活动将以与方向更改相同的方式重新启动.如果你想看,你可以看a list of all the different types of config changes.

Edit:更重要的是,正如hackbod在 comments 中指出的那样,当你的应用程序在后台,Android决定通过终止它来释放一些内存时,你的活动也会重新启动.当用户返回到您的应用程序时,Android将try 重新启动活动,方法与其他配置更改时的方式相同.如果你处理不好-用户会不高兴的…

换句话说,使用android:configChanges="keyboardHidden|orientation"并不能解决你的"担忧"正确的方法是对你的活动进行编码,让他们对安卓的重启感到满意.这是一个很好的实践,将帮助你在future 的道路上,所以要习惯它.

那我什么时候用呢?

正如您所说,这有一个明显的优势.通过自己处理来覆盖循环的默认配置更改将加快速度.然而,这种速度确实伴随着便利的代价.

简单地说,如果你对纵向和横向都使用相同的布局,那么通过覆盖,你的状态就很好.视图不会完全重新加载活动,而是简单地四处移动以填充剩余空间.

However,如果由于某种原因,当设备处于横向时,您使用了不同的布局,那么Android重新加载您的活动是好的,因为它将加载正确的布局.[如果你在这样一个活动上使用覆盖,并且想在运行时做一些神奇的重新布局……好吧,祝你好运——这可不简单]

快速总结

当然,如果android:configChanges="keyboardHidden|orientation"适合你,那就使用它.但是,一定要测试发生变化时会发生什么,因为方向改变并不是触发完全活动重启的唯一方式.

Android相关问答推荐

Android:点击操作栏返回按钮后应用程序无react

如何显示具体的商品数量?

expo 上的 socket.io 无法从 Android 连接

在 Android 房间迁移中获取上下文

如何删除 Jetpack Compose 中按钮的左边框?

ArrayList 上的 Android intent.getParcelableArrayListExtra 引发 Nullpointer 异常

Material 3 中的 ModalBottomSheet 用于 compose

Kotlin File(path).walkTopDown() 找不到文件

如何使用 Jetpack Compose 制作两个圆圈

如何在 BottomBar jetpack compose 中删除选定的椭圆项目 colored颜色

从 Firebase 云存储中获取照片会导致 Android Jetpack Compose 闪烁

Android 12 通过包管理器中断 APK 安装?

更改 Android SDK 版本 33 后建议在 xml 布局文件中不起作用

从expose 的 dropdownMenu 可组合、jetpack 组合中 Select 选项时,不会触发文本字段的 onValueChange

如何从 Jetpack Compose 中的 Radio 组中获取价值

Kotlin Compose forEach 中的负间距

Android Jetpack Compose - 找不到 R.drawable?

如何在 Compose 中更改高程 colored颜色 ?

我的自定义视图没有显示我应该如何修复它?

未使用的内容填充参数