你应该在哪里调用PreferenceManager.setDefaultValues?

时间:2011-08-01 22:32:05

标签: android preferences sharedpreferences

为了使用描述首选项的XML文件中的默认值初始化首选项,我可以调用PreferenceManager.setDefaultValues(this, R.xml.preference, false)。听起来很简单,但我不确定我应该在什么时候打电话给他?

正如我从文档中所理解的那样,在没有设置首选项的情况下,上述调用只需要一次。作为此调用的结果,将设置驻留在/data/data/<myapp>/shared_prefs中的首选项,因此所有后续读取首选项的尝试都将获得默认值。从逻辑上讲,应该在每个代码路径中调用setDefaultValues,这些代码路径可能在没有首选项已初始化的情况下执行。随着时间的推移,这被证明是多个地方 - 主要活动,另一个活动,后台服务,小BroadcastReceiver处理系统消息......现在我已拨打setDefaultValues onCreate()对于我的Application对象,因为我已经将它用作其他东西的方便单例。

问题:

  • 我是否保证每次执行代码时都会创建Application对象并运行onCreate?
  • 你是如何处理这个问题的?另一种方法是将默认值硬编码到getFoo(key, defValue)次调用中,但这会有效地将整个代码中的默认设置分散。

编辑:基本上,我不知道哪个解决方案更糟糕:每次在给定代码路径中访问prefs时调用setDefaultValues,或者在某个常见位置调用它(如app的onCreate)每次,无论我是否需要它。

1 个答案:

答案 0 :(得分:2)

我将删除原来的答案并回答您实际提出的问题。

  1. 是的,Application对象的onCreate将在每个进程开始时执行。请注意,并不保证每次 您都可以开始主要活动。如果Android仍然运行您的进程,它将再次使用它(例如,您仍然运行服务)。所以,是的,你正在做的事情会起作用,你的观察是正确的,不会爆炸。
  2. 我正在通过继承SharedPreferences来处理这个问题(我们称之为MyPrefs - 这不是我所说的,但这并不重要)。 MyPrefs的主要功能包括:
    1. 封装get / set方法,而不是直接访问密钥名称
    2. 处理加载默认值的代码。我通过使用静态布尔而不是AtomicBoolean告诉我是否已加载默认值,这有点懒。
  3. 话虽如此......它对我有用,但是如果你几乎肯定你每次代码运行时都会调用SharedPreferences,而你的代码就像任何代码一样好。

    希望这比我之前的回答更有帮助。