ความแตกต่างระหว่าง getDefaultSharedPreferences และ getSharedPreferences


224

ความแตกต่างระหว่างgetDefaultSharedPreferencesและgetSharedPreferencesใน Android คืออะไร? ใครช่วยอธิบายหน่อยได้ไหม


ความแตกต่างที่เกือบจะชัดเจนเกินไปคือสิ่งที่เป็นแบบสแตติกและไม่เป็นแบบนั้น แต่มันก็ไม่สำคัญเพราะคุณต้องการContextอินสแตนซ์เพื่อโทรหาทั้งคู่
LarsH

คำตอบ:


224

getDefaultSharedPreferencesจะใช้ชื่อเริ่มต้นเช่น "com.example.something_preferences" แต่getSharedPreferencesจะต้องมีชื่อ

getDefaultSharedPreferencesในความเป็นจริงใช้Context.getSharedPreferences(ด้านล่างมาโดยตรงจากแหล่ง 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;
}

9
การไม่getDefaultSharedPreferencesNameถูกต้องไม่เป็นสาธารณะเนื่องจากจำเป็นต้องใช้ชื่อสำหรับกรอบงานการสำรองข้อมูล / คืนค่า
มาร์ติน

สิ่งที่เกี่ยวกับstackoverflow.com/questions/10786172/
Dr.jacky

และวิธีฟังการเปลี่ยนแปลงการตั้งค่าในโหมด getSharedPreferences ที่ใช้ชื่อที่กำหนดเองสำหรับการตั้งค่า? (ไม่ใช้ชื่อเริ่มต้นเช่น getSharedPreferences "com.example.something_preferences")
Dr.jacky

คุณช่วยเพิ่มลิงค์ไปยังแหล่งที่มาได้ไหม?
Mr_and_Mrs_D

@Mr_and_Mrs_D ง่ายขึ้นที่จะค้นหา ถ้าฉันเพิ่มลิงค์มันจะเป็นเวอร์ชั่น API ที่เฉพาะเจาะจงซึ่งอาจจะใช่หรือไม่ใช่สิ่งที่คุณต้องการ
copolii

120

ตรวจสอบจุดพื้นฐานของความแตกต่าง:

  1. getDefaultSharedPreferences()ใช้ชื่อไฟล์การตั้งค่าเริ่มต้น ค่าเริ่มต้นนี้กำหนดไว้สำหรับแต่ละแอปพลิเคชันดังนั้นกิจกรรมทั้งหมดในบริบทแอพเดียวกันสามารถเข้าถึงได้อย่างง่ายดายเช่นในตัวอย่างต่อไปนี้:

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

    /data/data/com.package.name/shared_prefs/com.package.name_preferences.xmlการตั้งค่าจะถูกเก็บไว้ที่

  2. วิธีการอื่น - getSharedPreferences(name,mode)ต้องระบุชื่อการตั้งค่า (ไฟล์) และโหมดการทำงาน (เช่นส่วนตัว, world_readable, ฯลฯ )

ดังกล่าวโดย copolii ผลที่ได้คือเดียวกัน getSharedPreferences()แต่ตัวเลือกแรกคือง่ายและขาดความยืดหยุ่นในการแยกไฟล์การตั้งค่าหลายที่นำเสนอโดยตัวเลือกที่สองของ การแชร์ค่ากำหนดระหว่างแอพโดยใช้ตัวบ่งชี้การทำงาน MODE_WORLD_READABLE นั้นเป็นสิ่งที่เป็นไปได้เช่นกันgetSharedPreferences()งานได้ แต่ไม่ค่อยได้ใช้

IMHO, getDefaultSharedPreferences()สามารถใช้งานได้อย่างปลอดภัยโดยไม่ต้องสับสนกับชื่อไฟล์หลาย ๆ ไฟล์ที่มีแนวโน้มที่จะพิมพ์ผิดและสับสนยกเว้นว่าคุณต้องการโมดูลที่แตกต่างในแอพของคุณจะใช้ไฟล์ปรับแต่งต่าง ๆ โดยปกติแล้วสิ่งนี้ไม่จำเป็น หากแอพต้องการบันทึกพารามิเตอร์จำนวนมากอาจใช้ฐานข้อมูลภายนอกจะดีกว่าเนื่องจากมีการปกป้องข้อมูลที่ดีกว่า

หากมีคนรู้ว่ามีเหตุผลที่ดีที่จะใช้ getSharedPreferences () เป็นประจำและไม่ใช่ getDefaultSharedPreferences () โปรดแจ้งให้เราทราบโดยแสดงความคิดเห็นที่นี่


7
เหตุผลของฉันคือ: stackoverflow.com/questions/10786172/ …
Kostadin

1
และวิธีฟังการเปลี่ยนแปลงการตั้งค่าในโหมด getSharedPreferences ที่ใช้ชื่อที่กำหนดเองสำหรับการตั้งค่า? (ไม่ใช้ชื่อเริ่มต้นเช่น getSharedPreferences "com.example.something_preferences")
Dr.jacky

ดร. แจ็คกี้ฉันว่าคุณจะสรุปการตั้งค่าของคุณในวัตถุคล้ายเซสชัน: คลาสเซสชัน {prefs = getSharedPreferences () ... }} จากนั้นใช้ getters และ setters สำหรับสิ่งที่คุณต้องการตรวจสอบ เมื่อมีการตั้งค่าตัวเรียกคุณสามารถทริกเกอร์เหตุการณ์ในตรรกะตัวตั้งค่า
อเล็กซ์ Weavers

2

ฉันรู้ว่าโพสต์นี้ค่อนข้างเก่า แต่เนื่องจาก 24.0.1 ของไลบรารีการสนับสนุน v7 คุณสามารถดึงการตั้งค่าเริ่มต้นตามบริบทได้ทุกที่โดยใช้

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

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


PreferenceManager กำลังเลิกใช้งานใน Android Q. คุณยังสามารถใช้ context.getSharedPreferences ได้ เปลี่ยนการเรียกนี้เป็น context.getSharedPreferences ("$ {packageName} _preferences", MODE_PRIVATE)
Kevin

2
ดูเหมือนว่า PreferenceManager กำลังถูกคัดค้านเนื่องจากเพิ่งถูกย้ายไปยัง Androix developer.android.com/reference/androidx/preference/…
FutureShocked

1

มีฟังก์ชั่นที่ 3 เช่นกัน:

public SharedPreferences Activity.getPreferences(int mode) {}

ดูคำถามและคำตอบของฉันที่นี่: ยุ่งกับการตั้งค่าที่ใช้ร่วมกันของ android - ฟังก์ชั่นที่จะใช้?


นี่คือ wrapper สำหรับ getSharedPreferences () จากซอร์สโค้ดกิจกรรม: พับลิก SharedPreferences getPreferences (โหมด int) {return getSharedPreferences (getLocalClassName (), โหมด); }
tarn

1

ทั้ง getSharedPreferences () และ getDefaultSharedPreferences () ถูกใช้เพื่อเข้าถึงการกำหนดค่าตามความชอบระดับแอ็พพลิเคชัน. getDefaultSharedPreferences () ถูกใช้เพื่อรับการกำหนดค่าตามความชอบแบบแบ่งใช้ที่ทำงานตามกรอบการกำหนดค่าโดยรวมของ Android getDefaultSharedPreferences () ดีกว่าที่จะใช้เพราะให้วัตถุ SharedPreferences ที่ทำงานกับ PreferenceActivity ตามค่าเริ่มต้น


0

โปรดทราบว่าการใช้การกำหนดลักษณะที่แบ่งปันเป็นค่าเริ่มต้นนั้นไม่เหมือนกับการใช้การตั้งค่าแบบแบ่งใช้ที่มีชื่อแพ็คเกจของคุณ:

context.getSharedPreferences(getPackageName(), MODE_PRIVATE);

=> ชื่อการตั้งค่าที่แบ่งปัน: " com.my.packagename "

PreferenceManager.getDefaultSharedPreferences(context);

=> ชื่อการตั้งค่าที่แบ่งปัน: " com.my.packagename_preferences "

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.