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