首页 文章

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

提问于
浏览
163

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

产品:

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

  • 它更快

不太好:

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

坏:

  • 没有灵活的方法在不同的方向上有不同的布局

  • 使用片段时不太好

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

4 回答

  • 307

    是的,我认为暂停将比释放播放器更快 . 尽管如此,仍然有停顿 .

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

    在清单中声明您将处理屏幕方向的配置更改,然后使用onConfigurationChanged方法加载布局文件 . 通过在logCat中执行此操作,我可以看到onPause,onCreate和onResume未被调用,因此歌曲不会暂停 .

    • 更新清单以处理方向 .
    android:configChanges="orientation|screenSize"
    
    • 添加此代码
    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        // TODO Auto-generated method stub      
        super.onConfigurationChanged(newConfig);        
        setContentView(R.layout.activity_main);
    }
    
  • -3

    快速背景

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

    当您在AndroidManifest中定义 android:configChanges="keyboardHidden|orientation" 时,您正在告诉Android:"Please don't do the default reset when the keyboard is pulled out, or the phone is rotated; I want to handle this myself. Yes, I know what I'm doing"

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

    不用担心?

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

    无需担心您的活动被轮换

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

    但是,android:configChanges = "keyboardHidden|orientation"只不过是一个绑带 . 实际上,可以通过多种方式触发配置更改 . 例如,如果用户选择了一种新语言(即语言环境已更改),您的活动将以与方向更改相同的方式重新启动 . 如果你想,你可以查看a list of all the different types of config changes .

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

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

    所以我什么时候应该使用它?

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

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

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

    快速摘要

    无论如何,如果 android:configChanges="keyboardHidden|orientation" 适合您,那么请使用它 . 但是 PLEASE 一定要测试一些事情发生变化时会发生什么,因为方向改变不是触发完整的Acitivity重启的唯一方法 .

  • 2

    我不明白为什么......我认为偶尔的重启是正常的... configChanges为我处理大多数情况......也许在某些类型的应用程序中这可能是问题,但它实际上取决于应用程序的类型以及如何恢复应用程序重新启动时的状态...当我的某个应用程序重新启动时,用户会被注销并且最后一个活动会被我的代码打开,并且用户jus会失去一些步骤返回他所在的地方但并不是什么大不了...在其他情况下,某些状态始终保持不变某些状态总是在重启时恢复 . 当活动重新启动时,它必须是那个应用程序没有被使用或者什么......所以没有问题...在游戏中,例如这可能是问题,或者在某些其他类型的应用程序我不知道...

    我说当你这样做时,应用程序在正常情况下工作正常 . 代码更具可读性,没有大量的逻辑需要保存和恢复,你可以制造新的bug并且必须一直维护它...确保如果android失去动力并杀死你的应用程序窗口它会失去上下文和再次开始,但这只发生在特殊情况下,在我认为的新设备上,这种情况越来越罕见......

    所以杀了我,但我用它跨应用程序相当成功... android:configChanges =“locale | keyboard | keyboardHidden | orientation | screenLayout | uiMode | screenSize | smallestScreenSize”但我明白,对于某些特殊类型的应用程序,它可能不是好方法,但大多数应用程序可以生存有了这个就行了 .

  • -1

    从我的角度来看:如果横向和纵向模式下的布局相同 - 您也可以禁用应用中的两个中的一个 .

    我之所以这样说是因为当我改变方向时,我作为用户期望应用程序为我提供一些好处 . 如果我拿着手机没关系,那我就不需要选择 .

    以您拥有ListView的应用为例,点击ListItem后,您希望显示该项目的详细视图 . 在横向中,您可以将屏幕分为两部分,左侧是ListView,右侧是详细视图 . 在纵向中,您可以在一个屏幕中显示列表,然后在选择ListItem时将屏幕更改为详细视图 . 在这种情况下,方向更改是有意义的,也可以是不同的布局 .

相关问题