Різниця між getDefaultSharedPreferences та getSharedPreferences


224

Яка різниця між Android getDefaultSharedPreferencesі getSharedPreferencesв ньому? Хто-небудь може пояснити, будь ласка?


Майже занадто очевидна різниця полягає в тому, що одна статична, а одна - ні. Але це насправді не має значення, оскільки вам потрібен Contextекземпляр для того, щоб викликати будь-який.
LarsH

Відповіді:


224

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

9
До поганого getDefaultSharedPreferencesNameне є загальнодоступним, оскільки ім'я потрібно для рамки резервного копіювання / відновлення.
Мартін


І як слухати зміни уподобань у режимі getSharedPreferences, який використовує власну назву для налаштування? (не використовуйте за замовчуванням ім'я, як getSharedPreferences "com.example.something_preferences")
Dr.jacky

Не могли б ви додати посилання на джерело?
Mr_and_Mrs_D

@Mr_and_Mrs_D легше це шукати. Якщо я додам посилання, це було б до певної версії API, яка може бути, а може і не бути тією, що ви шукаєте.
copolii

120

Розглянемо основні моменти різниці:

  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)вимагає вказати назву конкретного уподобання (файлу) та режим роботи (наприклад, приватний, читати world_readble тощо)

Як зазначає copolii, результат той самий, але перший варіант простіший і не має гнучкості для поділу на кілька файлів уподобань, що пропонується другим варіантом getSharedPreferences(). Поділитися налаштуваннями між додатками за допомогою індикатора операції MODE_WORLD_READABLE також є чимось можливим getSharedPreferences(), але використовується рідко.

IMHO, getDefaultSharedPreferences()можна безпечно використовувати, не впадаючи в плутанину декількох імен файлів уподобань, які схильні до помилок і плутанини, якщо ви не хочете, щоб різні модулі у вашій програмі використовували різні файли налаштувань. Зазвичай це не потрібно. Якщо додатку потрібно зберегти велику кількість параметрів, можливо, використання зовнішньої бази даних буде кращим, оскільки це також забезпечує кращий захист даних.

Якщо хтось знає вагому причину регулярно використовувати getSharedPreferences (), а не getDefaultSharedPreferences (), будь ласка, повідомте мене про це, коментуючи тут.



1
І як слухати зміни уподобань у режимі getSharedPreferences, який використовує власну назву для налаштування? (не використовуйте за замовчуванням ім'я, як getSharedPreferences "com.example.something_preferences")
Dr.jacky

Dr.jacky, я б сказав, що ви перекладете свої переваги в якийсь об’єкт, подібний до сесії: class Session {prefs = getSharedPreferences () ...}, а потім використовувати getters та setters для речей, які ви хочете контролювати. Коли викликаються програми, ви можете викликати події в логіці встановлення.
Alex Weavers

2

Я знаю, що цей пост трохи старий, але з 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


Програма PreferenceManager застаріла в Android Q. Хоча ви все ще можете скористатися контекстом.getSharedPreferences. Змінено цей виклик на context.getSharedPreferences ("$ {packageName} _preferences", MODE_PRIVATE)
Кевін

2
Схоже, що PreferenceManager стареє, оскільки він просто переміщується до Androix. developer.android.com/reference/androidx/preference/…
FutureShocked

1

Також є 3-та функція:

public SharedPreferences Activity.getPreferences(int mode) {}

Дивіться моє запитання та відповідь тут: Поплутайтеся із загальними перевагами андроїда - яку функцію використовувати?


Це обгортка для getSharedPreferences () з вихідного коду діяльності: public SharedPreferences getPreferences (режим int) {повернути getSharedPreferences (повернути getSoredPlaferences (режим, getLocalClassName (), режим); }
tarn

1

І getSharedPreferences (), і getDefaultSharedPreferences () використовуються для доступу до налаштувань рівня додатків .getDefaultSharedPreferences () використовується для отримання спільних налаштувань, які працюють відповідно до загальної системи переваг Android. getDefaultSharedPreferences () краще використовувати, оскільки він дає об’єкт SharedPreferences, який за замовчуванням працює з PreferenceActivity.


0

Пам’ятайте, що використання спільних налаштувань за замовчуванням НЕ те саме, що використання спільних налаштувань з назвою вашого пакета:

context.getSharedPreferences(getPackageName(), MODE_PRIVATE);

=> Назва спільних налаштувань: " com.my.packagename "

PreferenceManager.getDefaultSharedPreferences(context);

=> Ім'я спільних налаштувань: " com.my.packagename_preferences "

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.