我想在我的一些活动中使用 android:configChanges="orientation|keyboardHidden",以便我的 onCreate 不会再次被调用,但我想先看看有没有人列出过利弊清单,因为这个链接说它只应作为最后的手段。
奇怪的是,Google在这方面并没有多谈论背后的原因,但我认为有三个主要原因可以避免使用这种方法:1. 根据我的经验,某些视图类型(特别是Android 2.1或更低版本上的WebView和MapView)在方向更改后,如果它们没有被重新创建,则可能会表现出奇怪的行为(例如,缩放按钮位置不正确)。2. 它会阻止您使用方向特定的布局(例如,请参见新市场应用程序的横向视图)。3. 它可能会使您无法发现与其他类型的Activity销毁和重新创建相关的应用程序错误行为(例如,在后台运行时发生低内存或其他常规终止)。也就是说,如果您的Activity可以优雅地处理由于旋转而导致的重启,那么它可能可以处理由于后台杀死而导致的重启。但是,如果您跳过旋转处理,则在正常测试期间可能不会遇到由于后台杀死而导致的重启,直到一位使用旧型号低内存手机的用户提交错误报告为止。最后一个原因是最重要的;特别是对于旧的低RAM手机和据说更具侵略性的姜饼版中的自动杀死行为,您的活动需要知道如何快速重建状态,而无论方向如何。一旦您的活动可以处理这些类型的销毁/重新创建,您可能已经为旋转更改杀死做好了准备。通过吸收旋转事件,您可以提高一些速度(因为您不必经过布局膨胀和所有那些操作),但在此时,这就是全部内容。如果您决定吞下旋转,我强烈建议始终使用带有“立即销毁活动”选项的Development.apk模拟器或设备,然后确保切换应用程序或通过任务堆栈进行后退仍然能够正常工作。根据我的经验,吸收旋转实际上是一种改善用户体验的好选择,特别是对于具有复杂布局的活动,这些活动可能需要一些时间才能重新创建,但您确实需要进行仔细测试并有效地确保即使没有旋转忽略,您的Activity仍将正常工作。
使用这种方法的一个优点是,你几乎不需要付出任何努力,而且你的应用程序可以在配置更改时保持运行而不会崩溃。小缺点是,使用特定于配置的资源(如横向或纵向方向)不会自动应用。在我(可能很少的)经验中,我认为做所有的工作并不值得。对这些配置更改的“正确”处理需要你大量的工作,如果你必须在屏幕方向更改期间支持进度对话框,情况会变得更加戏剧化。虽然大多数人会通过更改清单并使用android:configChanges =“keyboardHidden | orientation”来配置他们的活动,以进行快速修复,但我认为重要的是要意识到还有其他选择。它需要更多的代码,但它确实可以让你更好地了解整个系统的工作原理。