Где вы должны вызвать PreferenceManager.setDefaultValues? - PullRequest
5 голосов
/ 02 августа 2011

Чтобы инициализировать настройки со значениями по умолчанию из XML-файла, описывающего настройки, я могу позвонить PreferenceManager.setDefaultValues(this, R.xml.preference, false).Звучит просто, но я не совсем уверен, когда именно я должен это назвать?

Как я понял из документов, приведенный выше вызов необходим только один раз, в случае, когда никакие предпочтения еще не установлены.В результате этого вызова будут установлены предпочтения, расположенные в /data/data/<myapp>/shared_prefs, поэтому все последующие попытки прочитать предпочтения получат значения по умолчанию.Логически, setDefaultValues должен вызываться в каждом пути кода, который может быть выполнен без инициализации предпочтений.Со временем это оказалось в нескольких местах - основное действие, другое действие, фоновый сервис, небольшая BroadcastReceiver обработка системных сообщений ... Сейчас я поставил вызов setDefaultValues в onCreate() для моего объекта Application,как я уже использую его как удобный синглтон для других вещей.

Вопросы:

  • Есть ли у меня гарантия, что при каждом выполнении моего кода будет создаваться объект Application и запускаться onCreate?
  • Как вы справляетесьЭта проблема?Другим способом было бы жестко закодировать значения по умолчанию в вызовы getFoo(key, defValue), но это эффективно рассеивает ваши настройки по умолчанию по всему коду.

EDIT : По сути, я не знаюкакое решение хуже: вызывая setDefaultValues каждый раз, когда я получаю доступ к prefs по заданному пути кода, или вызывая его в каком-то обычном месте (например, в onCreate приложения), независимо от того, нужен он мне или нет.

1 Ответ

2 голосов
/ 02 августа 2011

Я собираюсь удалить свой исходный ответ и ответить на вопросы, которые вы на самом деле задавали.

  1. Да, onCreate объекта Application будет выполняться в начале каждого процесса.Имейте в виду, что это не гарантирует, что он будет запускаться каждый раз, когда вы начинаете свою основную деятельность.Если в Android все еще запущен ваш процесс, он будет использовать его снова (например, у вас все еще работает служба).Так что да, то, что вы делаете, сработает, и вы правильно заметили, что оно не взорвется.
  2. Я имею дело с этой проблемой, создав подкласс SharedPreferences (назовем это MyPrefs - это не таккак я это называю но это не важно).Ключевые особенности MyPrefs:
    1. инкапсуляция методов get / set вместо прямого доступа к именам ключей
    2. Обработка кода для загрузки значений по умолчанию.Я немного ленивый, используя статический логический тип вместо AtomicBoolean, чтобы сказать мне, загружены ли значения по умолчанию.

Сказав, что ... это работает дляя, но если вы почти уверены, что будете вызывать SharedPreferences каждый раз, когда ваш код работает там, где вы работаете, так же хорошо, как и все.

Надеюсь, это поможет больше, чем мой предыдущий ответ.

...