为了使用描述首选项的 XML 文件中的默认值初始化首选项,我可以调用 PreferenceManager.setDefaultValues(this, R.xml.preference, false)
.听起来很简单,但我不太确定我应该在什么时候调用它?
据我从文档中了解到,在尚未设置首选项的情况下,上述调用只需要一次。作为此调用的结果,驻留在 /data/data/<myapp>/shared_prefs
中的首选项将被设置,因此所有后续读取首选项的尝试都将获得默认值。从逻辑上讲,setDefaultValues
应该在每个可能在没有初始化首选项的情况下执行的代码路径中调用。随着时间的推移,这变成了多个地方 - 主要 Activity ,另一个 Activity ,后台服务,小BroadcastReceiver
处理系统消息...现在我已经调用setDefaultValues
在onCreate()
对于我的 Application 对象,因为我已经将它用作其他事物的方便单例。
问题:
- 我能保证每次执行我的代码时,都会创建 Application 对象并运行 onCreate 吗?
- 你是如何处理这个问题的?另一种方法是将默认值硬编码为
getFoo(key, defValue)
调用,但这会有效地将您的默认设置分散到整个代码中。
编辑:本质上,我不知道哪个解决方案更糟糕:调用 setDefaultValues
每次我访问给定代码路径中的 prefs,或者每次都在某个公共(public)位置(如应用程序的 onCreate)调用它,无论我是否需要它。
最佳答案
我将删除我的原始答案并回答您实际提出的问题。
- 是的,Application 对象的 onCreate 将在每个进程开始时执行。请记住,这并不能保证它会在您每次您开始主要 Activity 时运行。如果 Android 仍在运行您的进程,它将再次使用它(例如,您仍在运行服务)。所以是的,你正在做的事情会奏效,而且你观察到它不会爆炸是正确的。
- 我通过子类化 SharedPreferences 来处理这个问题(我们称它为
MyPrefs
-- 我不是这么叫它,但这并不重要)。 MyPrefs 的主要特点是:- get/set 方法的封装,而不是直接访问键名
- 加载默认值的处理代码。我有点懒惰,因为我使用静态 bool 值而不是 AtomicBoolean 来告诉我是否已加载默认值。
话虽如此......它对我有用,但如果你几乎可以肯定,每次你的代码在你工作的地方运行时都会调用 SharedPreferences。
希望这比我之前的回答更有帮助。
关于android - 您应该在哪里调用 PreferenceManager.setDefaultValues?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6905272/