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

yac*_*oob 5 android preferences sharedpreferences

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

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

问题:

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

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

Jas*_*son 2

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

  1. 是的,Application对象的onCreate将在每个进程开始时执行。请记住,这并不能保证它会在您每次开始主要活动时运行。如果 Android 仍然有您的进程在运行,它将再次使用该进程(例如,您仍然有一个服务正在运行)。所以是的,你正在做的事情将会起作用,并且你观察到它不会爆炸是正确的。
  2. 我正在通过子类化 SharedPreferences 来处理这个问题(我们这样称呼它MyPrefs——这不是我所说的,但这并不重要)。MyPrefs 的主要特点是:
    1. 封装get/set方法而不是直接访问键名
    2. 处理加载默认值的代码。我有点懒,使用静态布尔值而不是 AtomicBoolean 来告诉我默认值是否已加载。

话虽如此......它对我有用,但如果您几乎可以肯定,每次您的代码在您所在的位置运行时,您都会调用 SharedPreferences 。

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