Perbedaan antara getDefaultSharedPreferences dan getSharedPreferences

224

Apa perbedaan antara getDefaultSharedPreferencesdan getSharedPreferencesdi Android? Adakah yang bisa menjelaskannya?

James
sumber
Perbedaan yang hampir terlalu jelas adalah bahwa yang satu statis dan yang lain tidak. Tetapi itu tidak terlalu penting, karena Anda memerlukan sebuah Contextinstance untuk memanggil salah satu dari keduanya.
LarsH

Jawaban:

224

getDefaultSharedPreferencesakan menggunakan nama default seperti "com.example.something_preferences", tetapi getSharedPreferencesakan membutuhkan nama.

getDefaultSharedPreferencessebenarnya penggunaan Context.getSharedPreferences(di bawah ini langsung dari sumber 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;
}
copolii
sumber
9
Untuk buruk getDefaultSharedPreferencesNametidak umum karena nama diperlukan untuk kerangka cadangan / pemulihan.
Martin
Bagaimana dengan stackoverflow.com/questions/10786172/… ?
Dr.jacky
Dan bagaimana cara mendengarkan perubahan preferensi, dalam mode getSharedPreferences yang menggunakan nama khusus untuk preferensi? (tidak menggunakan nama default seperti getSharedPreferences "com.example.something_preferences")
Dr.jacky
Bisakah Anda menambahkan tautan ke sumbernya?
Mr_and_Mrs_D
@Mr_and_Mrs_D lebih mudah untuk melihatnya. Jika saya menambahkan tautan, itu akan ke versi API tertentu, yang mungkin atau mungkin tidak sesuai yang Anda cari.
copolii
120

Mari kita tinjau poin dasar perbedaan:

  1. getDefaultSharedPreferences()menggunakan nama file preferensi standar. Default ini disetel per aplikasi, sehingga semua aktivitas dalam konteks aplikasi yang sama dapat mengaksesnya dengan mudah seperti dalam contoh berikut:

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

    Preferensi biasanya disimpan di /data/data/com.package.name/shared_prefs/com.package.name_preferences.xml.

  2. Metode alternatif - getSharedPreferences(name,mode)mengharuskan untuk menunjukkan nama (file) preferensi tertentu dan mode operasi (misalnya pribadi, world_readable, dll.)

Seperti yang disebutkan oleh copolii, hasilnya sama, tetapi opsi pertama lebih sederhana dan tidak memiliki fleksibilitas untuk dipecah menjadi beberapa file preferensi, yang ditawarkan oleh opsi kedua getSharedPreferences(). Berbagi preferensi antara aplikasi menggunakan MODE_WORLD_READABLE indikator operasi juga sesuatu yang mungkin digunakan getSharedPreferences(), tetapi jarang digunakan.

IMHO, getDefaultSharedPreferences()dapat digunakan dengan aman tanpa masuk ke dalam kebingungan beberapa nama file preferensi yang rentan terhadap kesalahan ketik dan kebingungan, kecuali jika Anda ingin modul yang berbeda di aplikasi Anda akan menggunakan file preferensi yang berbeda. Biasanya ini tidak diperlukan. Jika aplikasi perlu menyimpan banyak parameter, mungkin menggunakan basis data eksternal akan lebih baik karena menawarkan perlindungan data yang lebih baik.

Jika seseorang mengetahui alasan yang bagus untuk menggunakan getSharedPreferences () secara teratur dan tidak getDefaultSharedPreferences (), beri tahu saya dengan berkomentar di sini.

wiztrail
sumber
7
Alasan saya adalah: stackoverflow.com/questions/10786172/…
Kostadin
1
Dan bagaimana cara mendengarkan perubahan preferensi, dalam mode getSharedPreferences yang menggunakan nama khusus untuk preferensi? (tidak menggunakan nama default seperti getSharedPreferences "com.example.something_preferences")
Dr.jacky
Dr.jacky Saya akan mengatakan Anda akan membungkus preferensi Anda dalam semacam objek Sesi: class Session {prefs = getSharedPreferences () ...} dan kemudian menggunakan getter dan setter untuk hal-hal yang ingin Anda pantau. Saat setter dipanggil, Anda dapat memicu peristiwa dalam logika setter.
Alex Weavers
2

Saya tahu posting ini agak lama, tetapi karena 24.0.1 dari perpustakaan dukungan v7 Anda dapat mengambil preferensi default berdasarkan konteks di mana saja menggunakan

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

Lihat https://developer.android.com/reference/android/support/v7/preference/PreferenceManager#getdefault Sharedpreferences

Makibo
sumber
PreferenceManager sedang tidak digunakan di Android Q. Anda masih bisa menggunakan cara context.getSharedPreferences. Mengubah panggilan ini ke context.getSharedPreferences ("$ {packageName} _preferences", MODE_PRIVATE)
Kevin
2
Sepertinya PreferenceManager sedang tidak digunakan lagi karena baru saja dipindahkan ke Androix. developer.android.com/reference/androidx/preference/…
FutureShocked
1

Ada fungsi ke-3 juga:

public SharedPreferences Activity.getPreferences(int mode) {}

Lihat pertanyaan dan jawaban saya di sini: Bercak dengan preferensi bersama android - yang berfungsi untuk digunakan?

Hack06
sumber
Ini adalah pembungkus untuk getSharedPreferences () dari kode sumber Activity: public SharedPreferences getPreferences (mode int) {return getSharedPreferences (mode getLocalClassName (),)); }
tarn
1

Baik getSharedPreferences () dan getDefaultSharedPreferences () digunakan untuk mengakses preferensi level aplikasi .getDefaultSharedPreferences () digunakan untuk mendapatkan preferensi bersama yang berfungsi sesuai dengan kerangka preferensi keseluruhan Android. getDefaultSharedPreferences () lebih baik digunakan karena memberikan objek SharedPreferences yang berfungsi dengan PreferenceActivity secara default.

Pengembang Android
sumber
0

Ketahuilah bahwa menggunakan preferensi bersama default TIDAK sama dengan menggunakan preferensi bersama dengan nama paket Anda:

context.getSharedPreferences(getPackageName(), MODE_PRIVATE);

=> Nama preferensi bersama: " com.my.packagename "

PreferenceManager.getDefaultSharedPreferences(context);

=> Nama preferensi bersama: " com.my.packagename_preferences "

Richard R
sumber