PreferenceManager.getDefaultSharedPreferences() vs getPreferences()

PreferenceManager.getDefaultSharedPreferences(context)

и

getPreferences()

похоже, извлекают разные настройки.

PreferenceManager.getDefaultSharedPreferences(context).getBoolean(
                        "userWasAskedToEnableGps", false);

для меня возвращает false,

getPreferences(MODE_PRIVATE).getBoolean("userWasAskedToEnableGps", false);

возвращает значение true.

Предпочтение было написано редактором, например

Editor e = getPreferences(MODE_PRIVATE).edit(); 
e.putBoolean (...);
e.commit();

Как я могу получить те же настройки за пределами действия из контекста?

Ответ 1

Из android github repo (1) мы видим, что getPreferences ничего не делает, кроме вызова метода getSharedPreferences с текущим именем класса.

public SharedPreferences getPreferences( int mode ) {
    return getSharedPreferences( getLocalClassName(), mode );
}

Ничто не ограничивает другие действия/код доступом к общему предпочтению с соответствующим именем класса. Что еще более важно, я предпочитаю не использовать getPreferences, так как это подразумевает = > никогда не меняет имя Activity. Если вы измените, тогда позаботьтесь о доступе к общим предпочтениям с явным упоминанием более раннего имени класса (до обновления).

Ответ 2

В соответствии с docs

getSharedPreferences() - используйте это, если вам нужны несколько файлов настроек, идентифицированных по имени, которые вы указываете с помощью первого параметра.

getPreferences() - используйте это, если для вашей деятельности требуется только один файл настроек. Поскольку это будет единственный файл настроек вашей активности, вы не укажете имя. область действия ограничена действительностью, где она создана

Итак, если вы хотите, чтобы предпочтение было доступно в другом действии или контексте, вы должны использовать либо getSharedPreferences(), либо getDefaultSharedPreferences()

Этот ans объясняет вам разницу между ними.

Ответ 3

Используйте Context.getSharedPreferences с тем же именем константы, и он предоставит вам те же настройки в любой точке вашего приложения.