Różnica między getDefaultSharedPreferences i getSharedPreferences

224

Jaka jest różnica między getDefaultSharedPreferencesi getSharedPreferencesna Androidzie? Czy ktoś może wyjaśnić?

James
źródło
Prawie zbyt oczywista różnica polega na tym, że jeden jest statyczny, a drugi nie. Ale to tak naprawdę nie ma znaczenia, ponieważ potrzebujesz Contextinstancji, aby wywołać jedno z nich.
LarsH

Odpowiedzi:

224

getDefaultSharedPreferencesużyje domyślnej nazwy, takiej jak „com.example.something_preferences”, ale getSharedPreferencesbędzie wymagała nazwy.

getDefaultSharedPreferencesw rzeczywistości wykorzystuje Context.getSharedPreferences(poniżej pochodzi bezpośrednio ze źródła Androida):

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;
}
copolii
źródło
9
Szkoda, że getDefaultSharedPreferencesNamenie jest publiczna, ponieważ nazwa jest potrzebna do tworzenia kopii zapasowych / przywracania.
Martin
A jak słuchać zmiany preferencji w trybie getSharedPreferences, które używają niestandardowych nazw dla preferencji? (nie należy używać domyślnej nazwy, takiej jak getSharedPreferences „com.example.something_preferences”)
Dr.jacky
Czy możesz dodać link do źródła?
Mr_and_Mrs_D
@Mr_and_Mrs_D łatwiej jest to sprawdzić. Jeśli dodam link, będzie to konkretna wersja interfejsu API, która może, ale nie musi być tym, czego szukasz.
copolii
120

Przyjrzyjmy się podstawowym różnicom:

  1. getDefaultSharedPreferences()używa domyślnej nazwy pliku preferencji. Ustawienie domyślne jest ustawione dla aplikacji, więc wszystkie działania w tym samym kontekście aplikacji mogą uzyskać do niego łatwy dostęp, jak w poniższym przykładzie:

    SharedPreferences spref = PreferenceManager.getDefaultSharedPreferences(this);
    if (spref.contains("email")) {
         String sEmailAddr = spref.getString("email", "");
    }

    Preferencje są zwykle przechowywane w /data/data/com.package.name/shared_prefs/com.package.name_preferences.xml.

  2. Metoda alternatywna - getSharedPreferences(name,mode)wymaga wskazania konkretnej nazwy preferencji (pliku) i trybu działania (np. Prywatny, czytelny na świecie itp.)

Jak wspomniano w copolii, wynik jest taki sam, ale pierwsza opcja jest prostsza i brakuje jej elastyczności dzielenia na wiele plików preferencji, która jest oferowana przez drugą opcję getSharedPreferences(). Udostępnianie preferencji między aplikacjami za pomocą wskaźnika działania MODE_WORLD_READABLE jest również możliwe przy użyciu getSharedPreferences(), ale rzadko używane.

IMHO, getDefaultSharedPreferences()można bezpiecznie używać bez wpadania w zamieszanie wielu nazw plików preferencji, które są podatne na literówki i zamieszanie, chyba że chcesz, aby różne moduły w Twojej aplikacji korzystały z różnych plików preferencji. Zwykle nie jest to konieczne. Jeśli aplikacja musi zapisać wiele parametrów, prawdopodobnie lepiej będzie korzystać z zewnętrznej bazy danych, ponieważ zapewnia ona lepszą ochronę danych.

Jeśli ktoś zna dobry powód, aby regularnie korzystać z getSharedPreferences (), a nie getDefaultSharedPreferences (), daj mi znać, komentując tutaj.

wiztrail
źródło
7
Mój powód to: stackoverflow.com/questions/10786172/...
Kostadin
1
A jak słuchać zmiany preferencji w trybie getSharedPreferences, które używają niestandardowych nazw dla preferencji? (nie należy używać domyślnej nazwy, takiej jak getSharedPreferences „com.example.something_preferences”)
Dr.jacky
Dr.jacky Powiedziałbym, że zamknąłbyś swoje preferencje w jakimś rodzaju obiektu podobnego do sesji: klasa Sesja {prefs = getSharedPreferences () ...}, a następnie użyj getterów i ustawiaczy dla rzeczy, które chcesz monitorować. Po wywołaniu seterów można wywoływać zdarzenia w logice seterów.
Alex Weavers
2

Wiem, że ten post jest trochę stary, ale od 24.0.1 biblioteki wsparcia v7 możesz pobrać domyślne preferencje według kontekstu w dowolnym miejscu za pomocą

// context might be an application context, activity, ..
// so if you want to get your apps defaults, pass an activity context
PreferenceManager.getDefaultSharedPreferences(context)

Zobacz https://developer.android.com/reference/android/support/v7/preference/PreferenceManager#getdefaultsharedpreferences

Makibo
źródło
PreferenceManager jest przestarzały w Androidzie Q. Nadal możesz jednak używać metody context.getSharedPreferences. Zmieniono to wywołanie na context.getSharedPreferences („$ {nazwa_pakietu} _preferencje”, MODE_PRIVATE)
Kevin
2
Wygląda na to, że PreferenceManager jest przestarzały, ponieważ jest właśnie przenoszony do Androix. developer.android.com/reference/androidx/preference/…
FutureShocked
1

Jest też trzecia funkcja:

public SharedPreferences Activity.getPreferences(int mode) {}

Zobacz moje pytanie i odpowiedź tutaj: Bałagan ze wspólnymi preferencjami Androida - jakiej funkcji użyć?

Hack06
źródło
Jest to opakowanie dla getSharedPreferences () z kodu źródłowego działania: public SharedPreferences getPreferences (tryb int) {return getSharedPreferences (getLocalClassName (), tryb); }
tarn
1

Zarówno getSharedPreferences (), jak i getDefaultSharedPreferences () są używane do uzyskiwania dostępu do preferencji na poziomie aplikacji .getDefaultSharedPreferences () służy do uzyskiwania wspólnych preferencji, które działają zgodnie z ogólnymi ramami preferencji Androida. Metoda getDefaultSharedPreferences () jest lepsza w użyciu, ponieważ udostępnia obiekt SharedPreferences, który domyślnie działa z PreferenceActivity.

Programista Androida
źródło
0

Pamiętaj, że użycie domyślnych preferencji wspólnych NIE jest tym samym, co użycie preferencji wspólnych z nazwą pakietu:

context.getSharedPreferences(getPackageName(), MODE_PRIVATE);

=> Nazwa wspólnych preferencji: „ com.my.packagename

PreferenceManager.getDefaultSharedPreferences(context);

=> Nazwa wspólnych preferencji: „ com.my.packagename_preferences

Richard R.
źródło