【问题标题】:why using android:configChanges is a bad practice为什么使用 android:configChanges 是一种不好的做法
【发布时间】:2016-06-13 10:11:55
【问题描述】:

我经历了不同的帖子和问题来处理轮换和AsyncTask。在每篇文章中都提到使用android:configChanges 是一种不好的做法。但我没有找到不鼓励这样做的真正原因以及为什么这是一种不好的做法。如果我们使用android:configChanges 来处理方向有什么缺点。

注意: 我知道它已经回答了如何处理方向和AsyncTask。但我想知道不使用android:configChanges 的原因。

【问题讨论】:

  • 其中一个原因是您将禁用 Android 的默认行为,并且您确实必须注意保留所有字符串。因此,最好将您的代码采用框架的规则,而不是与之抗争。但是,在某些情况下它是好的并且是唯一的解决方案,所以它并不全是“1 或 0”。

标签: android android-asynctask android-manifest screen-rotation


【解决方案1】:

好吧,您需要记住,Activity 可以出于多种原因重新启动。

例如,其中一个原因是当您的应用处于后台并且操作系统决定终止它(当然是使用您的Activity)以回收内存时。

当您返回您的应用程序时,操作系统会在您离开时尝试重新创建您的Activity,但不会这样做,因为您决定不理会它,只是在您的清单中使用了android:configChanges

如果您确保您的应用可以从重新启动中正常恢复,则可能根本不需要android:configChanges。因此,需要使用android:configChanges 可能表明您的应用存在一些缺陷,可能值得一看。

使用android:configChanges 是不错的做法,但如果你不明白自己在做什么,这很容易。

【讨论】:

    【解决方案2】:

    总结一下我从@user13 的答案和其他 stackoverflow 问题和博客文章中得到的所有内容,我想分享我的发现以明确一些非常重要的方面。

    1. (user13) 使用 android:configChanges 是不错的做法,但如果您不完全了解自己在做什么,这很容易

    2. 使用此技术会阻止您轻松使用特定于配置的资源。例如,如果您希望您的布局或可绘制对象或字符串或其他任何东西在纵向和横向上有所不同,则如果您使用android:configChanges,则必须自己管理它。

    3. 如果您决定使用android:configChanges,则需要覆盖并使用onConfigurationChanged() 方法来执行特定操作
    4. 正如用户 13 所述,重新创建 Activity 不仅是因为方向更改,而且还有多种原因可以重新启动 Activity。因此,应针对所有原因处理活动重启。使用android:configChanges 只能处理一种情况,并且会出现未处理的活动重启情况,这将导致潜在的错误。
    5. 有多种更好的方法来处理活动重启,并且在 stactoverflow 上也提供了大量帮助,因此根据文档,android:configChanges 应作为最后的手段。

    【讨论】:

      【解决方案3】:

      如果您知道自己在做什么,那么使用 android:configChanges 是一种很好的做法。

      只需始终测试您的应用程序在系统重新启动时的行为方式,以使用户感到舒适,因此必须始终保存某些状态,但不是全部。 通过这样的配置更改:

      android:configChanges="locale|keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"

      您的应用程序很少会在具有大量内存的新设备上重新启动。如果它重新启动,无论如何用户都不会那么意外,因为用户已经注意到其他地方并回到了应用程序。如果由于用户正在执行一些其他繁重的任务(玩游戏)而手动杀死应用程序或应用程序重新启动,用户不必在重新启动后处于完全相同的状态,用户体验在这里很重要。

      如果您需要为不同的布局刷新列表以更改方向,或者您需要隐藏一些视图元素,您可以调用:

      public void onConfigurationChanged(Configuration newConfig) {
          super.onConfigurationChanged(newConfig);
          _list.reloadData();
          _editorButton.visible(isPortrait());
      }
      

      (我使用我的自定义类,但你明白了)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-01-05
        • 2010-12-22
        • 1970-01-01
        • 2011-05-14
        • 2013-09-13
        • 2010-09-23
        • 1970-01-01
        相关资源
        最近更新 更多