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

Mik*_*oos 173 android android-layout

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

产品:

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

不太好:

  • 如果它们取决于屏幕尺寸,需要更改布局(例如,布局有两列左右)

坏:

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

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

yyd*_*ydl 324

快速背景

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

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

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

别担心?

您开始使用的专业之一是:

无需担心您的活动被轮换

在许多情况下,人们错误地认为当他们有一个由方向改变("轮换")产生的错误时,他们可以通过插入来简单地修复它android:configChanges="keyboardHidden|orientation".

但是,android:configChanges ="keyboardHidden | orientation"只不过是一个bandaid.实际上,可以通过多种方式触发配置更改.例如,如果用户选择了一种新语言(即语言环境已更改),您的活动将以与方向更改相同的方式重新启动.如果需要,您可以查看所有不同类型的配置更改的列表.

编辑:更重要的是,正如hackbod在评论中指出的那样,当您的应用处于后台时,您的活动也将重新启动,Android决定通过杀死它来释放一些内存.当用户返回您的应用程序时,Android将尝试以与其他配置更改时相同的方式重新启动活动.如果你无法处理 - 用户不会高兴...

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

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

如你所说,有一个明显的优势.通过自己处理轮换来覆盖轮换的默认配置更改将加快速度.然而,这种速度确实带来了便利的代价.

简单地说,如果你对肖像和风景都使用相同的布局,那么你可以通过覆盖来保持良好的状态.视图将完全转移以填充剩余空间,而不是对活动进行全面重新加载.

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

快速摘要

无论如何,如果android:configChanges="keyboardHidden|orientation"适合您,那就使用它.但务必测试一些内容发生变化时会发生什么,因为方向更改并不是触发完整Acitivity重启的唯一方法.

  • 值得补充的是,不处理重新启动的活动意味着您遇到的问题不仅仅是处理不太常见的配置更改.此处使用的活动重新启动与Android在后台终止您的应用时将您的活动恢复到之前状态的机制完全相同.因此,如果您没有正确执行此操作,那么当用户从后台返回时,您的用户将无法正常体验您的应用,具体取决于该进程是否正在被杀死.这样可以带来巨大的好处:它确保您的应用程序正确重启. (50认同)
  • 从Android 3.x上不要错过添加"screenSize"---------- android:configChanges = ["mcc","mnc","locale","touchscreen","keyboard", "keyboardHidden","navigation","screenLayout","fontScale","uiMode","orientation","screenSize","smallestScreenSize"] (14认同)
  • `请不要在拔出键盘时进行默认重置.我从未见过重启活动**键盘拔出**! (4认同)
  • 我注意到当您使用 configChanges 属性时,您的应用程序也会忽略方向锁定功能。你怎么能解决这个问题?如果你知道答案,请写在这里:http://stackoverflow.com/questions/24000361/how-to-avoid-activity-re-creation-when-being-rotated-while-also-respecting-orie (2认同)
  • 遗憾的是,这个答案没有提到官方 [Google 文档](http://developer.android.com/guide/topics/resources/runtime-changes.html#HandlingTheChange) 的主要解释。主要问题在于替代资源集,如果您想手动处理它,则不会在配置更改时自动为您应用。它不仅会影响所讨论的活动,还会影响整个应用程序。 (2认同)