Odpowiedzi:
getDefaultSharedPreferences
użyje domyślnej nazwy, takiej jak „com.example.something_preferences”, ale getSharedPreferences
będzie wymagała nazwy.
getDefaultSharedPreferences
w 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;
}
getDefaultSharedPreferencesName
nie jest publiczna, ponieważ nazwa jest potrzebna do tworzenia kopii zapasowych / przywracania.
Przyjrzyjmy się podstawowym różnicom:
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
.
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.
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)
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ć?
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.
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 ”
Context
instancji, aby wywołać jedno z nich.