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


177

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

产品:

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

不太好:

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

坏:

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

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


6
您还应该说明自己的想法 KeyboardHidden | orientation在做什么
Blundell

它阻止使用对指定配置更改的本机处理并允许应用程序进行处理,不是吗?
Mikooos 2011年

2
这就是为什么存在该选项的原因,如果您知道自己在做什么(资源没有变化),请使用它。
指针为空

为什么比使用ScreenSize更快?
batmaci

Answers:


333

快速背景

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

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

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

别担心?

您开始使用的优点之一是:

无需担心您的活动被轮换

在许多情况下,人们会错误地认为,当他们遇到因方向变化(“旋转”)而产生的错误时,他们可以简单地通过放入 android:configChanges="keyboardHidden|orientation"

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

编辑:更重要的是,但是,作为hackbod在评论中指出的那样,当您的应用程序处于后台并且Android决定通过杀死它释放一些内存时,您的活动也会重新开始。当用户返回到您的应用时,Android将尝试以其他方式更改配置的方式重新启动活动。如果您无法处理-用户将不会满意...

换句话说,使用android:configChanges="keyboardHidden|orientation"并不能解决您的“后顾之忧”。正确的方法是对您的活动进行编码,以使他们对Android重新启动时感到满意。这是一个很好的做法,它将对您有所帮助,因此请习惯它。

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

正如您提到的,它有明显的优势。通过自己处理轮换的默认配置更改,可以加快处理速度。但是,这种速度确实带来了便利。

简而言之,如果纵向和横向都使用相同的布局,则覆盖会保持良好状态。无需完全重新加载活动,视图将只是四处移动以填充剩余空间。

但是,如果由于某种原因在设备处于横向状态时使用了不同的布局,那么Android重新加载您的Activity的事实就很好了,因为它随后会加载正确的布局。[如果您在此类Activity上使用覆盖,并希望在运行时进行一些神奇的重新布局...好吧,祝您好运-绝非易事]

快速总结

无论如何,如果android:configChanges="keyboardHidden|orientation"适合您,请使用它。但是,务必测试发生更改时会发生什么情况,因为定向更改并不是触发完整的Activity重新启动的唯一方法。


50
值得补充的是,不处理活动重新启动意味着您比不处理不太常见的配置更改会遇到更大的问题。此处使用的活动重启与当您的应用在后台被杀死时Android将活动恢复到先前状态的机制完全相同。因此,如果您未正确执行此操作,则用户会从后台返回到您的应用程序时,会随机体验到您的应用程序无法正确返回的情况,具体取决于进程是否被终止。因此,这是一个巨大的好处:它可以确保您的应用正确重启。
hackbod 2011年

14
从Android 3.x开始,不要错过添加“ screenSize” ---------- android:configChanges = [“ mcc”,“ mnc”,“区域设置”,“触摸屏”,“键盘”, ““ keyboardHidden”,“导航”,“ screenLayout”,“ fontScale”,“ uiMode”,“ orientation”,“ screenSize”,“ smallestScreenSize”]
Michael Biermann

1
我注意到,当您使用configChanges属性时,您的应用程序还会忽略方向锁定功能。你怎么解决呢?如果你知道答案,请在这里写:stackoverflow.com/questions/24000361/...
Android开发者

4
Please don't do the default reset when the keyboard is pulled out我从未见过因键盘拔出而重新启动活动!
穆罕默德·巴巴尔

以及偶尔的重启是在我看来确定... configChanges手柄大多数情况下,我......那也许是因为在应用一些其他类型这可能是问题,但它取决于真的....
Renetik

2

从我的角度来看:如果横向和纵向模式下的布局都相同-您最好在应用程序中禁用两者之一。

我之所以这样说,是因为当我改变方向时,作为用户,我希望该应用程序能为我带来一些好处。如果我握住手机的方式无关紧要,则无需选择。

以一个拥有ListView的应用程序为例,在单击ListItem时希望显示该项目的详细视图。在横向视图中,您可以通过将屏幕一分为二来实现此目的,左侧为ListView,右侧为详细视图。在Portrait中,您将在一个屏幕中拥有列表,然后在选择ListItem时将屏幕更改为详细视图。在这种情况下,方向改变以及不同的布局都是有意义的。


4
是的,我们在应用程序的1.0版中使用了该版本,以匹配我们的Apple版本。它仅以肖像呈现。在Droid X上看起来很棒,我们完全匹配了IOS版本的弹出键盘行为。然后,首席财务官将应用程序安装在他的Droid上,将其转到侧面,然后将键盘滑开。哎呀。关于Android的事情是它是一个开放平台,您确实无法预测硬件配置或用户将要使用它进行什么操作,因此,为防万一,您可能应该同时支持这两种(所有)方向。
Tevo D

1
由于基本上是在硬件中,横向才是正常而非替代的方向,因此这偶然地覆盖了我们仅纵向的设置。这真的搞乱了我们的布局:(真是令人尴尬,在他安装应用后几秒钟内就出现了重大缺陷
Tevo D

1
您为什么要使其行为完全像iOS?:(
FunkTheMonk

7
@FunkTheMonk不幸的是,我们生活在商人做出技术决定的世界中。即使您反对,也有一半的时间他们认为自己是对的。他们控制您的薪水。
StackOverflowed 2012年

2
仅使用一种布局并不意味着屏幕旋转时将看起来相同。良好的XML布局结构将使事物自动移动以在合理的尺寸范围内正常工作,用户将对此表示赞赏。
梅琳达·格林

-1

我不明白为什么...。我认为偶尔重新启动是可以的... configChanges可以为我处理大多数情况...在某些类型的应用程序中可能会出现问题,但这实际上取决于应用程序的类型以及如何还原应用重新启动时的状态...当我的一个应用重新启动时,用户将重新登录,并且我的代码打开了上一个活动,而用户jus丢失了一些返回原位但并不重要的步骤。.在其他一些状态下,始终保持某些状态总是在重新启动时恢复。当活动重新开始时,必须是未使用该应用程序或某物...因此完全没有问题...例如在游戏中,这可能是问题,或者在其他我不知道的其他类型的应用程序中...

我说当您这样做时,应用程序在正常情况下就可以正常工作。而且代码更具可读性,无需大量逻辑来保存和还原您只能在其中产生新错误并必须始终对其进行维护的地方...确保android断电并杀死您的应用程序窗口会丢失上下文并重新开始,但这只是在特殊情况下发生,在我相信较新的设备上,这种情况越来越少...

所以杀了我,但是我在应用程序中非常成功地使用了它。不错的方法,但是大多数应用程序都可以忍受这一点。


嗨,有人对此主题有知识吗,请看一下我的主题:stackoverflow.com/questions/35941585/…?迫切需要帮助。
卢克·艾里森

您应该完全支持保存/恢复活动...处理轮换也没什么不同...您说您丢失了一些步骤...如果正确执行操作,则不会丢失任何步骤,并且可以准确地恢复用户的上一步操作...即使重新启动设备也是如此。
HaMMeReD

锤定我不知道您在说什么,但是我说当您这样做时,应用程序在正常情况下就可以正常工作。而且代码更具可读性,而无需大量逻辑来保存和还原您只能在其中产生新错误并必须始终对其进行维护的地方...确保android断电并杀死您的应用程序窗口会丢失上下文并重新开始,但这种情况仅在特殊情况下发生,在我相信较新的设备上,这种情况越来越少...
Renetik '16

忽略遵守活动合同(保存/恢复状态)是一种不好的做法,这是总体上糟糕的建议。尝试进行测试以防止进程死亡,并查看您的应用程序将您带到何处,如果您的用户在手机上使用至少2-3个应用程序并在它们之间进行切换,则此行为完全是标准的“正常情况”。
EpicPandaForce

-3

是的,我认为暂停会比释放播放器更快。仍然有停顿。

现在找到了不会暂停歌曲的解决方案。

在清单中声明您将处理屏幕方向的配置更改,然后使用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);
    }

您应该使用一项服务来播放音乐。认真地说,您是在告诉人们添加仍然包含“ // TODO自动生成的方法存根”的代码。马虎的解决方案。它也不能很好地工作,您需要重新绑定所有引用,否则,它们充其量是无法预测的。
HaMMeReD
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.