Разница между getDefaultSharedPreferences и getSharedPreferences - PullRequest
215 голосов
/ 10 мая 2011

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

Ответы [ 6 ]

222 голосов
/ 10 июня 2011

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;
}
118 голосов
/ 01 марта 2012

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

  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 (), пожалуйста, дайте мне знать, комментируя здесь.

2 голосов
/ 24 июля 2018

Я знаю, что этот пост немного устарел, но начиная с 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

1 голос
/ 13 февраля 2018

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

1 голос
/ 21 июня 2016

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

public SharedPreferences Activity.getPreferences(int mode) {}

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

0 голосов
/ 05 марта 2019

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

context.getSharedPreferences(getPackageName(), MODE_PRIVATE);

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

PreferenceManager.getDefaultSharedPreferences(context);

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

...