Разница между getDefaultSharedPreferences и getSharedPreferences
В чем разница между getDefaultSharedPreferences
а также getSharedPreferences
в Android? Кто-нибудь может объяснить, пожалуйста?
5 ответов
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;
}
Давайте рассмотрим основные отличия:
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()
, но редко используется.
ПО МОЕМУ МНЕНИЮ, getDefaultSharedPreferences()
можно безопасно использовать, не вдаваясь в путаницу имен файлов предпочтений, которые подвержены опечаткам и путанице, если только вы не хотите, чтобы разные модули в вашем приложении использовали разные файлы предпочтений. Обычно это не нужно. Если приложению необходимо сохранить много параметров, вероятно, будет лучше использовать внешнюю базу данных, поскольку оно также обеспечивает лучшую защиту данных.
Если кто-то знает вескую причину для регулярного использования getSharedPreferences(), а не getDefaultSharedPreferences(), пожалуйста, дайте мне знать, комментируя здесь.
Я знаю, что этот пост немного устарел, но начиная с 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
Имейте в виду, что использование общих настроек по умолчанию НЕ совпадает с использованием общих настроек с именем вашего пакета:
context.getSharedPreferences(getPackageName(), MODE_PRIVATE);
=> Имя общих настроек: "com.my.packagename"
PreferenceManager.getDefaultSharedPreferences(context);
=> Имя общих настроек: "com.my.packagename_preferences"
Оба метода getSharedPreferences() и getDefaultSharedPreferences() используются для доступа к предпочтениям уровня приложения. GetDefaultSharedPreferences () используется для получения общих предпочтений, которые работают в соответствии с общей платформой предпочтений Android.getDefaultSharedPreferences() лучше использовать, так как он предоставляет объект SharedPreferences, который по умолчанию работает с PreferenceActivity.
Также есть 3-я функция:
public SharedPreferences Activity.getPreferences(int mode) {}
См. Мой вопрос и ответ здесь: Возиться с общими предпочтениями Android - какую функцию использовать?