ใช้ค่าค่ากำหนดที่บันทึกไว้ เป็นส่วนหนึ่งของ Android Jetpack

เอกสารนี้อธิบายวิธีจัดเก็บและใช้งาน ค่า Preference ที่ได้รับการบันทึกโดย ไลบรารีค่ากำหนด

พื้นที่เก็บข้อมูลค่ากำหนด

ส่วนนี้จะอธิบายวิธีที่ Preference คงข้อมูลไว้ได้

ค่ากำหนดที่แชร์

โดยค่าเริ่มต้น Preference จะใช้ SharedPreferences เพื่อบันทึก SharedPreferences API รองรับการอ่านและการเขียนแบบง่าย คู่คีย์-ค่าจากไฟล์ที่บันทึกในเซสชันของแอปพลิเคชัน ไลบรารีค่ากำหนดใช้อินสแตนซ์ SharedPreferences ส่วนตัวเพื่อให้มีเพียงอินสแตนซ์ แอปพลิเคชันสามารถเข้าถึงได้

ลองดูตัวอย่างต่อไปนี้ SwitchPreferenceCompat:

<SwitchPreferenceCompat
       
app:key="notifications"
       
app:title="Enable message notifications"/>

เมื่อผู้ใช้สลับสวิตช์นี้เป็น "เปิด" สถานะ ไฟล์ SharedPreferences อัปเดตด้วยคู่คีย์-ค่า "notifications" : "true" คีย์ที่ใช้คือ เหมือนกับชุดคีย์สำหรับ Preference

ดูข้อมูลเพิ่มเติมเกี่ยวกับ SharedPreferences API ได้ที่บันทึกคีย์-ค่า

สำหรับข้อมูลเกี่ยวกับวิธีต่างๆ ในการจัดเก็บข้อมูลบน Android โปรดดูที่ข้อมูล และภาพรวมพื้นที่เก็บข้อมูลไฟล์

PreferenceDataStore

แม้ว่าไลบรารีค่ากำหนดจะยังคงอยู่ที่ข้อมูล SharedPreferences โดย ค่าเริ่มต้น SharedPreferences ไม่ใช่โซลูชันที่สมบูรณ์แบบเสมอไป ตัวอย่างเช่น หาก แอปพลิเคชันของคุณกำหนดให้ผู้ใช้ต้องลงชื่อเข้าใช้ คุณอาจต้องการคง การตั้งค่าแอปพลิเคชันในระบบคลาวด์เพื่อให้การตั้งค่ามีผลทั่วทั้ง อุปกรณ์และแพลตฟอร์มอื่นๆ ในทำนองเดียวกัน หากแอปพลิเคชันของคุณมีการกำหนดค่า ที่เฉพาะอุปกรณ์ ผู้ใช้แต่ละรายบนอุปกรณ์มีการตั้งค่าแยกจากกัน ทำให้ SharedPreferences เป็นโซลูชันที่ไม่ค่อยดีที่สุด

PreferenceDataStore ช่วยให้คุณใช้แบ็กเอนด์พื้นที่เก็บข้อมูลที่กำหนดเองเพื่อคงค่า Preference ไว้ได้ สำหรับข้อมูลเพิ่มเติม ดูข้อมูลที่หัวข้อใช้พื้นที่เก็บข้อมูลที่กำหนดเอง

อ่านค่าค่ากำหนด

หากต้องการเรียกออบเจ็กต์ SharedPreferences ที่ใช้อยู่ ให้เรียก PreferenceManager.getDefaultSharedPreferences() แม้ว่าวิธีการนี้จะใช้งานได้จากทุกที่ในแอปพลิเคชันของคุณ เราขอแนะนำให้คุณ แยกแอปออกเป็นเลเยอร์ต่างๆ สำหรับข้อมูลเพิ่มเติม โปรดดู ข้อมูล เลเยอร์

ตัวอย่างเช่น ระบุ EditTextPreference ที่มีคีย์ "signature" ในรูปแบบ ดังต่อไปนี้:

<EditTextPreference
       
app:key="signature"
       
app:title="Your signature"/>

คุณดึงค่าที่บันทึกไว้สำหรับ Preference นี้ทั่วโลกได้ดังนี้

KotlinJava
val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this /* Activity context */)
val name = sharedPreferences.getString("signature", "")
SharedPreferences sharedPreferences =
       
PreferenceManager.getDefaultSharedPreferences(this /* Activity context */);
String name = sharedPreferences.getString("signature", "");

ฟังการเปลี่ยนแปลงค่าค่ากำหนด

หากต้องการฟังการเปลี่ยนแปลงของค่า Preference คุณสามารถเลือกระหว่าง 2 ค่า อินเทอร์เฟซ:

ตารางต่อไปนี้แสดงความแตกต่างของอินเทอร์เฟซทั้ง 2 รายการ

OnPreferenceChangeListener OnSharedPreferenceChangeListener
ตั้งค่าใน Preference เครื่องเดียว ใช้กับวัตถุทั้งหมด Preference รายการ
มีการเรียกเมื่อ Preference กำลังจะเปลี่ยนค่าที่บันทึกไว้ แม้ว่ามูลค่าที่รอดำเนินการจะเป็นค่าเดียวกับค่าที่บันทึกไว้ก็ตาม เรียกใช้เมื่อบันทึกค่าสำหรับ Preference เท่านั้น
เรียกใช้ผ่านคลัง Preference เท่านั้น ส่วนที่แยกต่างหาก ของแอปพลิเคชันจะเปลี่ยนค่าที่บันทึกไว้ได้ เรียกใช้เมื่อค่าที่บันทึกไว้มีการเปลี่ยนแปลง แม้ว่าจะมาจาก ของแอปพลิเคชัน
มีการเรียกก่อนที่จะบันทึกค่าที่รอดำเนินการ มีการเรียกหลังจากบันทึกค่าแล้ว
เรียกใช้เมื่อใช้ SharedPreferences หรือ PreferenceDataStore โทรเมื่อใช้ SharedPreferences เท่านั้น

ติดตั้ง OnPreferenceChangeListener

การใช้ OnPreferenceChangeListener ช่วยให้คุณรอฟังสถานะที่รอดำเนินการได้ เปลี่ยนเป็นค่าของ Preference จากนั้นคุณจะสามารถตรวจสอบได้ว่าการเปลี่ยนแปลง เกิดขึ้น ตัวอย่างเช่น โค้ดต่อไปนี้แสดงวิธีการรับการเปลี่ยนแปลงไปยัง ของ EditTextPreference ที่มีคีย์เป็น "name":

KotlinJava
override fun onPreferenceChange(preference: Preference, newValue: Any): Boolean {
   
Log.e("preference", "Pending Preference value is: $newValue")
   
return true
}
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
   
Log.e("preference", "Pending Preference value is: " + newValue);
   
return true;
}

ต่อไป คุณต้องตั้งค่า Listener นี้โดยตรงด้วย setOnPreferenceChangeListener() ดังนี้

KotlinJava
preference.onPreferenceChangeListener = ...
preference.setOnPreferenceChangeListener(...);

ใช้งาน OnSharedPreferenceChangeListener

เมื่อยืนยันค่า Preference โดยใช้ SharedPreferences คุณยังสามารถใช้ SharedPreferences.OnSharedPreferenceChangeListenerเพื่อฟังการเปลี่ยนแปลง ซึ่งจะช่วยให้คุณฟังเมื่อค่าที่ Preference บันทึกไว้มีการเปลี่ยนแปลง เช่น เมื่อซิงค์การตั้งค่ากับเซิร์ฟเวอร์ ตัวอย่างต่อไปนี้จะแสดงวิธีการ ฟังการเปลี่ยนแปลงค่าของ EditTextPreference ที่มีคีย์เป็น "name":

KotlinJava
override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String) {
   
if (key == "signature") {
       
Log.i(TAG, "Preference value was updated to: " + sharedPreferences.getString(key, ""))
   
}
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
   
if (key.equals("signature")) {
       
Log.i(TAG, "Preference value was updated to: " + sharedPreferences.getString(key, ""));
   
}
}

ลงทะเบียน Listener โดยใช้ registerOnSharedPreferenceChangedListener() ดังนี้

KotlinJava
preferenceManager.sharedPreferences.registerOnSharedPreferenceChangeListener(...)
getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(...);

KotlinJava
    val listener: SharedPreferences.OnSharedPreferenceChangeListener =
           
SharedPreferences.OnSharedPreferenceChangeListener {...}
   
    SharedPreferences.OnSharedPreferenceChangeListener listener =
           
new SharedPreferences.OnSharedPreferenceChangeListener() {...}
   

สำหรับการจัดการอายุการใช้งานที่เหมาะสมใน Activity หรือ Fragment ให้ลงทะเบียนและ ยกเลิกการลงทะเบียน Listener นี้ใน Callback onResume() และ onPause() ดังที่แสดง ในตัวอย่างต่อไปนี้

KotlinJava
override fun onResume() {
   
super.onResume()
    preferenceManager
.sharedPreferences.registerOnSharedPreferenceChangeListener(this)
}

override fun onPause() {
   
super.onPause()
    preferenceManager
.sharedPreferences.unregisterOnSharedPreferenceChangeListener(this)
}
@Override
public void onResume() {
   
super.onResume();
    getPreferenceManager
().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
}

@Override
public void onPause() {
   
super.onPause();
    getPreferenceManager
().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
}

ใช้พื้นที่เก็บข้อมูลที่กำหนดเอง

แม้ว่าเราจะแนะนำให้ยืนยันออบเจ็กต์ Preference โดยใช้ SharedPreferences คุณยังใช้พื้นที่เก็บข้อมูลที่กำหนดเองได้ด้วย พื้นที่เก็บข้อมูลที่กำหนดเองอาจมีประโยชน์หากคุณ แอปพลิเคชันจะยังคงเก็บค่าไว้ในฐานข้อมูลหรือหากค่าเป็นค่าเฉพาะอุปกรณ์ เช่น ที่แสดงในตัวอย่างต่อไปนี้

ใช้งานพื้นที่เก็บข้อมูล

หากต้องการใช้พื้นที่เก็บข้อมูลที่กำหนดเอง ให้สร้างคลาสที่ขยาย PreferenceDataStore ตัวอย่างต่อไปนี้จะสร้างพื้นที่เก็บข้อมูลที่จัดการ ค่า String:

KotlinJava
class DataStore : PreferenceDataStore() {
   
override fun putString(key: String, value: String?) {
       
// Save the value somewhere.
   
}

   
override fun getString(key: String, defValue: String?): String? {
       
// Retrieve the value.
   
}
}
public class DataStore extends PreferenceDataStore {
   
@Override
   
public void putString(String key, @Nullable String value) {
       
// Save the value somewhere.
   
}
   
@Override
   
@Nullable
   
public String getString(String key, @Nullable String defValue) {
       
// Retrieve the value.
   
}
}

เรียกใช้การดำเนินการที่ใช้เวลานานนอกเทรดหลักเพื่อหลีกเลี่ยงการบล็อกผู้ใช้ ของ Google เนื่องจากเป็นไปได้สำหรับ Fragment หรือ Activity ที่มี พื้นที่เก็บข้อมูลจะถูกทำลายขณะคงค่า ให้เรียงลำดับข้อมูลเป็นอนุกรมเพื่อให้คุณ จะไม่สูญเสียค่าใดๆ ที่ผู้ใช้เปลี่ยนแปลง

เปิดใช้พื้นที่เก็บข้อมูล

หลังจากใช้พื้นที่เก็บข้อมูลแล้ว ให้ตั้งค่าพื้นที่เก็บข้อมูลใหม่ใน onCreatePreferences() เพื่อให้ออบเจ็กต์ Preference คงค่าที่มีค่า พื้นที่เก็บข้อมูล แทนการใช้ SharedPreferences เริ่มต้น คุณสามารถเปิดใช้ พื้นที่เก็บข้อมูลสำหรับ Preference แต่ละรายการหรือทั้งลำดับชั้น

หากต้องการเปิดใช้พื้นที่เก็บข้อมูลที่กำหนดเองสำหรับ Preference ที่เฉพาะเจาะจง โปรดโทร setPreferenceDataStore() ใน Preference ดังที่แสดงในตัวอย่างต่อไปนี้

KotlinJava
val preference: Preference? = findPreference("key")
preference
?.preferenceDataStore = dataStore
Preference preference = findPreference("key");
if (preference != null) {
    preference
.setPreferenceDataStore(dataStore);
}

หากต้องการเปิดใช้พื้นที่เก็บข้อมูลที่กำหนดเองสำหรับทั้งลำดับชั้น โปรดเรียกใช้ setPreferenceDataStore() ใน PreferenceManager:

KotlinJava
val preferenceManager = preferenceManager
preferenceManager
.preferenceDataStore = dataStore
PreferenceManager preferenceManager = getPreferenceManager();
preferenceManager
.setPreferenceDataStore(dataStore);

พื้นที่เก็บข้อมูลที่ได้รับการตั้งค่าสําหรับ Preference ที่เจาะจงจะลบล้างพื้นที่เก็บข้อมูลที่ สำหรับลำดับชั้นที่เกี่ยวข้อง ในกรณีส่วนใหญ่ คุณจะตั้งค่าพื้นที่เก็บข้อมูลสำหรับ ทั้งลำดับชั้น