为什么使用android:configChanges是一种不好的做法

12

我浏览了多篇处理旋转和 AsyncTask 的帖子和问题。每篇文章都提到使用 android:configChanges 是一种不好的做法。但我没有找到它为什么被反对以及为什么是个不好的做法的实际原因。如果我们使用 android:configChanges 来处理方向,那么有哪些缺点呢?

注意: 我知道如何处理方向和 AsyncTask,但我想知道不使用 android:configChanges 的原因。


请查看:https://github.com/open-keychain/open-keychain/issues/257 - Janki Gadhiya
1
其中一个原因是这样做会禁用Android的默认行为,你必须非常注意保持所有字符串的控制权。因此,最好遵循框架规则来调整你的代码,而不是与其抗争。但是,在某些情况下,这是一个好的且唯一的解决方案,所以并不是“要么1,要么0”的问题。 - Bozic Nebojsa
3个回答

9

请记住,一个Activity可能会因多种原因而重新启动。

例如,其中的一个原因是当你的应用程序处于后台时,操作系统决定终止它(包括你的Activity)以释放内存。

当你返回到你的应用程序时,操作系统将尝试像你离开时一样重新创建你的Activity,但由于你决定不去烦恼它,只是在清单文件中使用了android:configChanges,所以操作系统会失败。

如果你确保你的应用程序可以从重新启动中正确恢复,那么android:configChanges可能根本不需要。因此,使用android:configChanges需要可能表明你的应用程序存在一些缺陷,值得检查。

使用android:configChanges并不是不好的做法,但如果你不完全理解你所做的事情,它很容易变得不好。


3
总结一下我从@user13的回答以及其他stackoverflow问题和博客文章中学到的内容,我想分享我的发现,以澄清一些非常重要的方面。
  1. (user13)使用android:configChanges不是坏习惯,但如果您不确切知道自己在做什么,很容易就会出错。
  2. 使用这种技术会使得您无法轻松地使用特定于配置的资源。例如,如果您希望在纵向和横向模式下具有不同的布局、绘图或字符串等,则必须自行管理,如果使用android:configChanges,则无法轻松完成。
  3. 如果您决定使用android:configChanges,则需要覆盖并使用onConfigurationChanged()方法执行特定操作。
  4. 正如user13所提到的那样,Activity不仅因为方向更改而重新创建,还有多个原因可能导致Activity重新启动。因此,应该为所有原因处理活动重新启动。只使用android:configChanges只处理一种情况,并且会导致潜在的bug,存在未处理的活动重新启动情况。
  5. 有多种更好的方法来处理活动重新启动,stackoverflow上也有很多帮助,因此根据文档,应将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());
}

(我使用自定义类,但你明白我的意思)
注:本段内容涉及 IT 技术。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接