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

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

货物:

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

不太好:

  • 如果需要根据屏幕大小改变布局(例如两栏左右的布局)

坏:

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

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

101148 次浏览

从我的角度来看: 如果布局在横向和纵向模式都是相同的-你也可以在你的应用程序中禁用其中一个。

我之所以这样说,是因为作为一个用户,我希望当我改变方向时,这个应用程序能给我带来一些好处。如果我怎么拿手机都不重要,那我也不需要选择。

例如,在一个应用程序中,您有一个 ListView,单击 ListItem 后,您希望显示该项的详细视图。在横向中,你可以把屏幕一分为二,左边是 ListView,右边是详细视图。在 Portrait 中,将列表放在一个屏幕中,然后在选择 ListItem 时将屏幕更改为详细视图。在这种情况下,方向更改和不同的布局都是有意义的。

快速背景介绍

默认情况下,当 Android 上发生某些关键配置更改时(一个常见的例子是方向更改) ,Android 将完全重新启动正在运行的 Activity,以帮助它适应这些更改。

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

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

不用担心吗?

一开始你的优点之一就是:

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

在许多情况下,人们错误地认为,当方向改变(“旋转”)导致错误时,他们可以简单地通过输入 android:configChanges="keyboardHidden|orientation"来修复它。

然而,android: configChanges = “ keyboardHidden | location”只不过是一个创可贴。事实上,有许多方法可以触发配置更改。例如,如果用户选择了一种新的语言(即语言环境已经更改) ,那么您的活动将通过方向更改以相同的方式重新启动。如果你想,你可以查看 所有不同类型的配置更改的列表

编辑 : 更重要的是,正如 Hackbod在评论中指出的那样,当你的应用处于后台,Android 决定关闭它以释放一些内存时,你的活动也会重新启动。当用户返回到你的应用程序时,Android 会尝试重新启动活动,如果有其他配置变化,它会以同样的方式重新启动活动。如果你不能处理-用户将不会高兴..。

换句话说,使用 android:configChanges="keyboardHidden|orientation"并不能解决您的“烦恼”正确的方法是对你的活动进行编码,这样他们就会对 Android 的任何重启感到满意。这是一个很好的实践,将帮助你在道路上,所以要习惯它。

那我什么时候用呢?

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

简单地说,如果你使用相同的布局为纵向和横向,你是在良好的形状做覆盖。视图将简单地移动以填充剩余的空间,而不是完全重新加载活动。

然而 ,如果出于某种原因,当设备处于横向位置时,你使用了不同的布局,那么 Android 重新加载你的 Activity 是很好的事实,因为它会加载正确的布局。[如果你在这样一个活动上使用覆盖,并且想要在运行时做一些神奇的重新布局... ... 那么,祝你好运——这并不简单]

快速摘要

无论如何,如果 android:configChanges="keyboardHidden|orientation"适合你,那就使用它。但是,求你了一定要测试当某些事情发生变化时会发生什么,因为方向变化不是触发完全活动重启的唯一方式。

是的,我认为暂停会使它比释放球员更快。虽然仍然有暂停。

现在已经找到了一个解决方案,不会暂停的歌曲。

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

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

    android:configChanges="orientation|screenSize"
    
  2. add this code

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

我不明白为什么..。在我看来,偶尔重启是可以的... ... configChanges 可以处理大多数情况... ... 也许在某些类型的应用程序中,这可能是个问题,但这真的取决于应用程序的类型,以及当应用程序重启时如何恢复状态... ... 当我的一个应用程序重启时,用户被记录回来,最后一个活动由我的代码打开,用户只是失去了一些步骤回到他原来的位置,但不是。.在其他情况下,某些状态总是保持不变,而某些状态总是在重新启动时恢复。当活动重新启动,它必须是应用程序没有被使用或东西... 所以没有问题... 在游戏中,例如,这可能是问题,也许在其他类型的应用程序,我不知道..。

我说,当您这样做时,应用程序在正常情况下工作得很好。而且代码更容易阅读,不需要大量的逻辑来保存和恢复,你只需要制造新的 bug,并且不得不一直维护它... 当然,如果 Android 失去电源,杀死你的应用程序窗口,它就会失去上下文,重新启动,但是这种情况只会发生在特殊的情况下,在更新的设备上,我相信这是越来越少见的..。

所以杀了我吧,但是我很成功地跨应用程序使用了这个..。 配置更改 = “ locale | 键盘 | keyboardHidden | 倾向 | screen Layout | uiMode | screen Size | smallestScreenSize” 但是我理解对于一些特殊的应用程序来说,这可能不是一个好方法,但是大多数应用程序都可以接受这个方法。