GetDefaultSharedPreferences ve getSharedPreferences arasındaki fark


224

Arasındaki fark nedir getDefaultSharedPreferencesve getSharedPreferencesAndroid'de? Herkes açıklayabilir mi?


Neredeyse çok açık bir fark, birinin statik ve diğerinin olmamasıdır. Ama önemli değil, çünkü Contextikisini de aramak için bir örneğe ihtiyacınız var .
LarsH

Yanıtlar:


224

getDefaultSharedPreferences"com.example.something_preferences" gibi bir varsayılan adını kullanacak, ancak getSharedPreferencesolacak gerektiren bir isim.

getDefaultSharedPreferencesaslında kullanır Context.getSharedPreferences(aşağıda doğrudan Android kaynağından):

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
getDefaultSharedPreferencesNameYedekleme / geri yükleme çerçevesi için ad gerektiğinden kötüye genel değildir.
Martin


Tercih için özel ad kullanan getSharedPreferences modunda tercih değişikliğini nasıl dinleyebilirim? (getSharedPreferences "com.example.something_preferences" gibi varsayılan adı kullanmayın)
Dr.jacky

Lütfen kaynağa bir bağlantı ekleyebilir misiniz?
Mr_and_Mrs_D

@Mr_and_Mrs_D aramak daha kolay. Bir bağlantı eklersem, aradığınız şey olabilir veya olmayabilir belirli bir API sürümüne olurdu.
copolii

120

Temel fark noktalarını gözden geçirelim:

  1. getDefaultSharedPreferences()varsayılan bir tercih dosyası adı kullanır. Bu varsayılan uygulama başına ayarlanır, böylece aynı uygulama bağlamındaki tüm etkinlikler aşağıdaki örnekteki gibi kolayca erişebilir:

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

    Tercihler genellikle adresinde saklanır /data/data/com.package.name/shared_prefs/com.package.name_preferences.xml.

  2. Alternatif yöntem - getSharedPreferences(name,mode)belirli bir tercih (dosya) adı ve bir işlem modunun (ör. Özel, world_readable, vs.) belirtilmesini gerektirir.

Copolii tarafından belirtildiği gibi, sonuç aynıdır, ancak ilk seçenek daha basittir ve ikinci seçenek tarafından sunulan çoklu tercih dosyalarına bölünme esnekliğinden yoksundur getSharedPreferences(). MODE_WORLD_READABLE çalışma göstergesi kullanarak uygulamalar arasında tercihleri ​​paylaşmak da mümkün olan bir şeydir getSharedPreferences(), ancak nadiren kullanılır.

IMHO, getDefaultSharedPreferences()uygulamanızdaki farklı modüllerin farklı tercih dosyaları kullanmasını istemiyorsanız, yazım hatalarına ve karışıklığa eğilimli çoklu tercih dosya adlarının karışıklığına girmeden güvenle kullanılabilir. Normalde buna gerek yoktur. Bir uygulamanın çok fazla parametre kaydetmesi gerekiyorsa, muhtemelen daha iyi veri koruması sunduğu için harici veritabanı kullanmak daha iyi olacaktır.

Birisi getDefaultSharedPreferences () öğesini değil, getSharedPreferences () öğesini düzenli olarak kullanmak için iyi bir neden biliyorsa, lütfen buraya yorum yaparak bana bildirin.



1
Tercih için özel ad kullanan getSharedPreferences modunda tercih değişikliğini nasıl dinleyebilirim? (getSharedPreferences "com.example.something_preferences" gibi varsayılan adı kullanmayın)
Dr.jacky

Dr.jacky Tercihlerinizi Session benzeri bir nesnede tamamlayacağınızı söyleyebilirim: class Session {prefs = getSharedPreferences () ...} ve sonra izlemek istediğiniz şeyler için getters ve setters kullanın. Ayarlayıcılar çağrıldığında, ayarlayıcı mantığındaki olayları tetikleyebilirsiniz.
Alex Weavers

2

Bu yazının biraz eski olduğunu biliyorum, ancak v7 destek kütüphanesinin 24.0.1'inden beri, herhangi bir yeri kullanarak içeriğe göre varsayılan tercihleri ​​alabilirsiniz

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

Bkz. Https://developer.android.com/reference/android/support/v7/preference/PreferenceManager#getdefaultsharedpreferences


Android Q'da PreferenceManager kullanımdan kaldırılıyor. Yine de hala context.getSharedPreferences yolunu kullanabilirsiniz. Bu çağrıyı context.getSharedPreferences ("$ {packageName} _preferences", MODE_PRIVATE) olarak değiştirdi
Kevin

2
Görünüşe göre PreferenceManager artık Androix'e taşındığı için kullanımdan kaldırılıyor. developer.android.com/reference/androidx/preference/…
FutureShocked,


1

Hem getSharedPreferences () hem de getDefaultSharedPreferences (), uygulama düzeyindeki tercihlere erişmek için kullanılır .getDefaultSharedPreferences (), Android'in genel tercih çerçevesine göre çalışan paylaşılan tercihleri ​​almak için kullanılır. getDefaultSharedPreferences () yöntemi, varsayılan olarak PreferenceActivity ile çalışan SharedPreferences nesnesini verdiği için daha iyidir.


0

Varsayılan paylaşılan tercihleri kullanmanın, paket adınızla paylaşılan tercihleri ​​kullanmakla aynı OLMADIĞINI unutmayın:

context.getSharedPreferences(getPackageName(), MODE_PRIVATE);

=> Paylaşılan tercihlerin adı: " com.my.packagename "

PreferenceManager.getDefaultSharedPreferences(context);

=> Paylaşılan tercihlerin adı: " com.my.packagename_preferences "

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.