Відповіді:
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)
вимагає вказати назву конкретного уподобання (файлу) та режим роботи (наприклад, приватний, читати world_readble тощо)
Як зазначає copolii, результат той самий, але перший варіант простіший і не має гнучкості для поділу на кілька файлів уподобань, що пропонується другим варіантом getSharedPreferences()
. Поділитися налаштуваннями між додатками за допомогою індикатора операції MODE_WORLD_READABLE також є чимось можливим getSharedPreferences()
, але використовується рідко.
IMHO, 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) {}
Дивіться моє запитання та відповідь тут: Поплутайтеся із загальними перевагами андроїда - яку функцію використовувати?
І getSharedPreferences (), і getDefaultSharedPreferences () використовуються для доступу до налаштувань рівня додатків .getDefaultSharedPreferences () використовується для отримання спільних налаштувань, які працюють відповідно до загальної системи переваг Android. getDefaultSharedPreferences () краще використовувати, оскільки він дає об’єкт SharedPreferences, який за замовчуванням працює з PreferenceActivity.
Пам’ятайте, що використання спільних налаштувань за замовчуванням НЕ те саме, що використання спільних налаштувань з назвою вашого пакета:
context.getSharedPreferences(getPackageName(), MODE_PRIVATE);
=> Назва спільних налаштувань: " com.my.packagename "
PreferenceManager.getDefaultSharedPreferences(context);
=> Ім'я спільних налаштувань: " com.my.packagename_preferences "
Context
екземпляр для того, щоб викликати будь-який.