В чем разница между getDefaultSharedPreferences() и getPreferences()?

В настоящее время я прохожу курс Udacity «Разработка приложений для Android». В сегменте «Урок 3: Новые действия и намерения > Использование общих настроек» инструктор попросил меня покопаться на сайте Android Developer, чтобы узнать, как получить пользовательские настройки от SharedPreferences. Однако я нашел разницу между официальной документацией и решением курса.

В решении курса Udacity говорится, что для захвата экземпляра SharedPreferences для PreferenceActivity необходимо вызвать:

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity());

(где getActivity() здесь просто Context, потому что он вызывается внутри Fragment.)

В то время как в официальной документации на сайте разработчиков Android указано, что вы следует позвонить:

SharedPreferences prefs = getActivity().getPreferences(Context.MODE_PRIVATE)

Так в чем разница между PreferenceManager.getDefaultSharedPreferences(Context context) и Activity.getPreferences(int mode)?

Обратите внимание: этот вопрос не касается getSharedPreferences(), для которого требуется имя файла. Речь идет о разнице между getPreferences() и getDefaultSharedPreferences().

Заранее спасибо.


person fqf555    schedule 31.10.2015    source источник


Ответы (4)


Согласно предоставленной вами ссылке на документацию Android

getSharedPreferences() — используйте это, если вам нужно несколько файлов настроек, идентифицируемых по имени, которое вы указываете с первым параметром.

getPreferences() — используйте это, если вам нужен только один файл настроек для вашей деятельности. Поскольку это будет единственный файл настроек для вашей деятельности, вы не указываете имя.

Так и есть, используйте getSharedPreferences, когда данные, которые вы хотите сохранить/получить, можно использовать из разных действий в приложении. Если эти настройки будут использоваться только в одном действии, вы можете использовать getPreferences.

Изменить: также обратите внимание, что, как сказано в сообщении, на которое вы ссылаетесь, «getDefaultSharedPreferences будет использовать имя по умолчанию, например com.example.something_preferences, но для getSharedPreferences потребуется имя»

person Shyri    schedule 31.10.2015
comment
вопрос не касался getsharedprefereces ... он касался различий между getdefaultsharedpreference и getpreferences ... также обратите внимание, что если ключ / значение предпочтения сохраняется с использованием настроек getshared или getpreferences, он не будет доступен в качестве предпочтения по умолчанию в другом действии. .. вы знаете, как заданный вопрос о различиях между вещами, на которые вы не обращались ... - person me_; 07.07.2016

Одно из основных отличий: getPreferences() возвращает файл, относящийся только к активности, из которой он был открыт. В то время как getDefaultSharedPreferences() возвращает глобальные настройки приложения. Узнал, что вчера на собственном горьком опыте.

person me_    schedule 05.07.2016
comment
Здесь вы можете найти соответствующую документацию: developer.android.com/guide/ темы/пользовательский интерфейс/ - person Genma; 24.07.2016
comment
Если я вас правильно понял, вызов getPreferences() в двух разных действиях приведет к созданию двух разных файлов, верно? - person theJian; 29.11.2018

Если вы заглянете внутрь PreferenceManager:

public static SharedPreferences getDefaultSharedPreferences(Context context) {
    return context.getSharedPreferences(getDefaultSharedPreferencesName(context),
            getDefaultSharedPreferencesMode());
}

/**
 * Returns the name used for storing default shared preferences.
 *
 * @see #getDefaultSharedPreferences(Context)
 * @see Context#getSharedPreferencesPath(String)
 */
public static String getDefaultSharedPreferencesName(Context context) {
    return context.getPackageName() + "_preferences";
}

private static int getDefaultSharedPreferencesMode() {
    return Context.MODE_PRIVATE;
}

Таким образом, getDefaultSharedPreferences() использует метод getSharedPreferences() с вашим именем пакета приложения и режимом private, если вы используете getPreferences() из действия, он будет использовать тот же метод getSharedPreferences(), но с getLocalClassName();

person Onregs    schedule 02.11.2016

Из первой статьи, ссылка на которую приведена ниже: «Примечание. API-интерфейсы SharedPreferences предназначены только для чтения и записи пар «ключ-значение», и их не следует путать с API-интерфейсами предпочтений, которые помогают создавать пользовательский интерфейс для настроек вашего приложения (хотя они используют SharedPreferences в качестве реализации для сохранения настроек приложения)."

http://developer.android.com/training/basics/data-storage/shared-preferences.html

http://developer.android.com/guide/topics/ui/settings.html

person William Greendale    schedule 31.10.2015