Разница между getDefaultSharedPreferences и getSharedPreferences

224

В чем разница между getDefaultSharedPreferencesи getSharedPreferencesв Android? Кто-нибудь может объяснить, пожалуйста?

Джеймс
источник
Почти слишком очевидное различие заключается в том, что один статичен, а другой нет. Но это на самом деле не имеет значения, так как вам нужен Contextэкземпляр для вызова любого из них.
LarsH

Ответы:

224

getDefaultSharedPreferencesбудет использовать имя по умолчанию, например «com.example.something_preferences», но getSharedPreferencesдля него потребуется имя.

getDefaultSharedPreferencesфактически использует Context.getSharedPreferences(ниже непосредственно из источника Android):

public static SharedPreferences getDefaultSharedPreferences(Context context) {
    return context.getSharedPreferences(getDefaultSharedPreferencesName(context),
        getDefaultSharedPreferencesMode());
}

private static String getDefaultSharedPreferencesName(Context context) {
    return context.getPackageName() + "_preferences";
}

private static int getDefaultSharedPreferencesMode() {
    return Context.MODE_PRIVATE;
}
copolii
источник
9
Плохо getDefaultSharedPreferencesNameне публично, так как имя необходимо для структуры резервного копирования / восстановления.
Мартин
А как насчет stackoverflow.com/questions/10786172/… ?
Dr.jacky
А как прослушать изменение предпочтения в режиме getSharedPreferences, в котором для предпочтения используется пользовательское имя? (не используйте имя по умолчанию, например getSharedPreferences "com.example.something_preferences")
Dr.jacky
Не могли бы вы добавить ссылку на источник?
Mr_and_Mrs_D
@Mr_and_Mrs_D проще искать. Если я добавлю ссылку, то это будет конкретная версия API, которая может или не может быть то, что вы ищете.
Кополия
120

Давайте рассмотрим основные отличия:

  1. getDefaultSharedPreferences()использует имя файла настроек по умолчанию. Это значение по умолчанию установлено для каждого приложения, поэтому все действия в одном контексте приложения могут легко получить к нему доступ, как в следующем примере:

    SharedPreferences spref = PreferenceManager.getDefaultSharedPreferences(this);
    if (spref.contains("email")) {
         String sEmailAddr = spref.getString("email", "");
    }

    Предпочтения обычно хранятся в /data/data/com.package.name/shared_prefs/com.package.name_preferences.xml.

  2. Альтернативный метод - getSharedPreferences(name,mode)требует указать конкретное имя предпочтения (файла) и режим работы (например, private, world_readable и т. Д.)

Как уже упоминалось в copolii, результат тот же, но первый вариант проще и ему не хватает гибкости для разделения на несколько файлов предпочтений, что предлагается вторым вариантом getSharedPreferences(). Совместное использование предпочтений между приложениями, использующими индикатор работы MODE_WORLD_READABLE, также возможно getSharedPreferences(), но редко используется.

ИМХО, getDefaultSharedPreferences()можно безопасно использовать, не вдаваясь в путаницу имен файлов предпочтений, которые подвержены опечаткам и путанице, если только вы не хотите, чтобы разные модули в вашем приложении использовали разные файлы предпочтений. Обычно это не нужно. Если приложению необходимо сохранить много параметров, вероятно, будет лучше использовать внешнюю базу данных, поскольку оно также обеспечивает лучшую защиту данных.

Если кто-то знает хорошую причину для регулярного использования getSharedPreferences (), а не getDefaultSharedPreferences (), пожалуйста, дайте мне знать, комментируя здесь.

wiztrail
источник
7
Моя причина: stackoverflow.com/questions/10786172/…
Костадин
1
А как прослушать изменение предпочтения в режиме getSharedPreferences, в котором для предпочтения используется пользовательское имя? (не используйте имя по умолчанию, например getSharedPreferences "com.example.something_preferences")
Dr.jacky
Dr.jacky Я бы сказал, что вы обернули бы свои предпочтения в некоторый объект типа Session: class Session {prefs = getSharedPreferences () ...}, а затем использовали бы методы получения и установки для вещей, которые вы хотите отслеживать. При вызове сеттеров вы можете запускать события в логике сеттера.
Алекс Уиверс
2

Я знаю, что этот пост немного устарел, но начиная с 24.0.1 из библиотеки поддержки v7 вы можете получить настройки по умолчанию в любом месте, используя контекст

// context might be an application context, activity, ..
// so if you want to get your apps defaults, pass an activity context
PreferenceManager.getDefaultSharedPreferences(context)

См. Https://developer.android.com/reference/android/support/v7/preference/PreferenceManager#getdefaultsharedpreferences

Makibo
источник
PreferenceManager устарел в Android Q. Тем не менее, вы все равно можете использовать метод context.getSharedPreferences. Изменен этот вызов на context.getSharedPreferences ("$ {packageName} _preferences", MODE_PRIVATE)
Кевин
2
Похоже, что PreferenceManager устарел, поскольку он просто перемещается в Androix. developer.android.com/reference/androidx/preference/...
FutureShocked
1

Также есть 3-я функция:

public SharedPreferences Activity.getPreferences(int mode) {}

См. Мой вопрос и ответ здесь: Возиться с общими предпочтениями Android - какую функцию использовать?

Hack06
источник
Это оболочка для getSharedPreferences () из исходного кода Activity: public SharedPreferences getPreferences (int mode) {return getSharedPreferences (getLocalClassName (), mode); }
Тарн
1

Оба метода getSharedPreferences () и getDefaultSharedPreferences () используются для доступа к настройкам уровня приложения. GetDefaultSharedPreferences () используется для получения общих настроек, которые работают в соответствии с общей платформой предпочтений Android. getDefaultSharedPreferences () лучше использовать, поскольку он предоставляет объект SharedPreferences, который по умолчанию работает с PreferenceActivity.

Android-разработчик
источник
0

Помните, что использование общих настроек по умолчанию НЕ совпадает с использованием общих настроек с именем вашего пакета:

context.getSharedPreferences(getPackageName(), MODE_PRIVATE);

=> Имя общих настроек: " com.my.packagename "

PreferenceManager.getDefaultSharedPreferences(context);

=> Имя общих настроек: " com.my.packagename_preferences "

Ричард Р
источник