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

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

产品:

  • 无需担心你的活动被旋转
  • 速度更快

不太好:

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

坏:

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

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

快速的背景

默认情况下,当Android上发生某些关键configuration变化(一个常见的例子是方向变化)时,Android会完全重启运行的Activity来帮助它适应这种变化。

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

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

别担心?

从你开始的优点之一是,有:

无需担心你的活动被旋转

在很多情况下,人们错误地认为,当他们有一个方向变化(“旋转”)产生的错误,他们可以通过把android:configChanges="keyboardHidden|orientation"简单地修复它。

但是,android:configChanges =“keyboardHidden | orientation”不过是一个bandaid。 事实上,可以触发configuration更改的方法有很多种。 例如,如果用户select了一种新的语言(即语言环境已经改变),那么您的活动将以与方向改变相同的方式重新开始。 如果你想要的话,你可以查看所有不同types的configuration更改列表 。

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

换句话说,使用android:configChanges="keyboardHidden|orientation"并不是解决您的“烦恼”的方法。 正确的方法是编写你的活动,让他们很高兴Android的任何重新启动。 这是一个很好的练习,可以帮助你走上正路,所以习惯了。

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

正如你所说,有一个明显的优势。 通过自行处理来改写默认的configuration更改会加快速度。 但是,这个速度确实带来了方便的价格。

简单地说,如果你对肖像和风景使用相同的布局,你可以通过覆盖来保持良好的状态。 而不是完整的重新加载活动,这些意见将转移到填补剩余的空间。

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

快速总结

无论如何,如果android:configChanges="keyboardHidden|orientation"适合你,那就使用它。 但务必testing一些事情发生变化时会发生什么情况,因为方向变化不是触发完整性重启动的唯一方式。

从我的angular度来看:如果布局在横向和纵向模式下都是一样的,那么也可以禁用应用程序中的一个。

我之所以这么说是因为我作为一个用户期望应用程序为我提供一些好处,当我改变方向时。 如果拿我的手机无所谓,那我就不需要这个select。

举例来说,你有一个ListView的应用程序,并点击一个ListItem你想显示该项目的详细视图。 在横向上,您可以将屏幕分为两部分,左边是ListView,右边是详细视图。 在“纵向”中,您将在一个屏幕中显示列表,然后在selectListItem时将屏幕更改为详细视图。 在这种情况下,方向的变化以及不同的布局都是有意义的。

我不明白为什么….在我看来偶尔重新启动是好的… configChanges处理大多数情况下,我可能… …也许在某些types的应用程序这可能是问题,但它取决于真正的应用程序types,以及如何恢复状态当应用程序重新启动…当我的应用程序重新启动时,用户重新login和最后一个活动打开我的代码和用户的法律失去了一些步骤,回到他在哪里,但没有什么大不了的。在其他一些国家总是坚持和一些状态总是在重新启动时恢复。 当活动重新启动,它必须是该应用程序还没有被使用或什么…所以没有问题…在游戏中,例如,这可能是问题,也许在一些其他types的应用程序,我不知道…

我说,当你这样做的时候,应用程序在正常情况下工作正常。 而且代码更可读,不需要大量的逻辑来保存和恢复,只要你可以做出新的错误,并必须保持它所有的时间…当然,如果android失去了权力,并杀死你的应用程序窗口失去了上下文和重新开始,但这只是在特殊情况下发生,而在较新的设备上,我相信这是越来越罕见…

所以杀了我,但我用这个应用程序相当成功… android:configChanges =“locale | keyboard | keyboardHidden | orientation | screenLayout | uiMode | screenSize | smallestScreenSize”但我明白,对于一些特殊types的应用程序可能不好方法,但大多数应用程序可以与此生活就好了。

是的,我认为暂停会比释放玩家更快。 尽pipe如此,仍然有暂停。

现在find了一个不会暂停歌曲的解决scheme。

在清单中声明您将处理屏幕方向的configuration更改,然后使用onConfigurationChanged方法加载布局文件。 通过在logCat中这样做,我可以看到onPause,onCreate&onResume不被调用,因此歌曲不会暂停。

  1. 更新清单来处理方向。

     android:configChanges="orientation|screenSize" 
  2. 添加此代码

     @Override public void onConfigurationChanged(Configuration newConfig) { // TODO Auto-generated method stub super.onConfigurationChanged(newConfig); setContentView(R.layout.activity_main); }