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

В чем разница между getDefaultSharedPreferences и getSharedPreferences в Android? Может кто-нибудь объяснить?

Ответ 1

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;
}

Ответ 2

Рассмотрим основные точки разницы:

  • 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.

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

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

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

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

Ответ 4

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

Ответ 5

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