استفاده از مقادیر ترجیحی ذخیره شده بخشی از Android Jetpack .
این سند نحوه ذخیره و استفاده از مقادیر Preference
را که توسط کتابخانه Preference ذخیره می شوند، توضیح می دهد.
ذخیره سازی داده ترجیحی
این بخش توضیح می دهد که چگونه یک Preference
می تواند داده ها را حفظ کند.
SharedPreferences
به طور پیش فرض، یک Preference
از SharedPreferences
برای ذخیره مقادیر استفاده می کند. SharedPreferences
API از خواندن و نوشتن جفت های کلید-مقدار ساده از فایلی که در جلسات برنامه ذخیره می شود، پشتیبانی می کند. کتابخانه Preference از یک نمونه SharedPreferences
خصوصی استفاده می کند تا فقط برنامه شما بتواند به آن دسترسی داشته باشد.
به عنوان مثال، SwitchPreferenceCompat
زیر را فرض کنید:
<SwitchPreferenceCompat app:key="notifications" app:title="Enable message notifications"/>
هنگامی که کاربر این سوئیچ را به حالت "روشن" تغییر می دهد، فایل SharedPreferences
با یک جفت کلید-مقدار "notifications" : "true"
. کلید استفاده شده همان کلید تنظیم شده برای Preference
است.
برای اطلاعات بیشتر درباره SharedPreferences
API، به ذخیره دادههای کلید-مقدار مراجعه کنید.
برای اطلاعات در مورد روشهای مختلف ذخیرهسازی دادهها در Android، مرور کلی دادهها و ذخیرهسازی فایل را ببینید.
PreferenceDataStore
اگرچه کتابخانه Preference داده ها را به طور پیش فرض با SharedPreferences
حفظ می کند، SharedPreferences
همیشه راه حل ایده آلی نیست. به عنوان مثال، اگر برنامه شما نیاز به ورود کاربر به سیستم دارد، ممکن است بخواهید تنظیمات برنامه را در فضای ابری ادامه دهید تا تنظیمات در سایر دستگاه ها و پلتفرم ها منعکس شود. به طور مشابه، اگر برنامه شما دارای گزینههای پیکربندی خاص دستگاه باشد، هر کاربر در دستگاه تنظیمات جداگانهای دارد که SharedPreferences
را به راهحلی کمتر از ایدهآل تبدیل میکند.
یک PreferenceDataStore
به شما امکان می دهد از یک ذخیره سازی سفارشی برای حفظ مقادیر Preference
استفاده کنید. برای اطلاعات بیشتر، به استفاده از ذخیرهگاه داده سفارشی مراجعه کنید.
مقادیر ترجیحی را بخوانید
برای بازیابی شی SharedPreferences
که استفاده می شود، PreferenceManager.getDefaultSharedPreferences()
را فراخوانی کنید. اگرچه این روش در هر نقطه از برنامه شما کار می کند، توصیه می کنیم برنامه خود را به لایه ها تقسیم کنید. برای اطلاعات بیشتر، به لایه داده مراجعه کنید.
به عنوان مثال، یک EditTextPreference
با کلید "signature"
به صورت زیر داده می شود:
<EditTextPreference app:key="signature" app:title="Your signature"/>
می توانید مقدار ذخیره شده برای این Preference
به صورت جهانی بازیابی کنید:
کاتلین
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
، میتوانید بین دو رابط یکی را انتخاب کنید:
جدول زیر تفاوت این دو رابط را نشان می دهد:
OnPreferenceChangeListener | OnSharedPreferenceChangeListener |
---|---|
روی یک Preference تنظیم کنید. | برای همه اشیاء Preference اعمال می شود. |
زمانی فراخوانی میشود که یک Preference قصد دارد مقدار ذخیره شده خود را تغییر دهد، حتی اگر مقدار در انتظار با مقدار ذخیره شده یکسان باشد. | فقط زمانی فراخوانی می شود که مقدار ذخیره شده برای یک Preference تغییر کند. |
فقط از طریق کتابخانه Preference تماس گرفته می شود. بخش جداگانه ای از برنامه می تواند مقدار ذخیره شده را تغییر دهد. | هر زمان که مقدار ذخیره شده تغییر کند، فراخوانی می شود، حتی اگر از قسمت جداگانه ای از برنامه باشد. |
قبل از ذخیره شدن مقدار معلق فراخوانی می شود. | پس از ذخیره مقدار فراخوانی می شود. |
هنگام استفاده از SharedPreferences یا PreferenceDataStore تماس گرفته می شود. | فقط هنگام استفاده از SharedPreferences تماس گرفته می شود. |
OnPreferenceChangeListener را پیاده سازی کنید
پیاده سازی OnPreferenceChangeListener
به شما امکان می دهد به تغییرات معلق در مقدار یک Preference
گوش دهید. سپس، می توانید تأیید کنید که آیا تغییر رخ می دهد یا خیر. به عنوان مثال، کد زیر نحوه گوش دادن به تغییر مقدار یک EditTextPreference
را با کلید "name"
نشان می دهد:
کاتلین
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; }
در مرحله بعد، شما باید مستقیماً این شنونده را با setOnPreferenceChangeListener()
به صورت زیر تنظیم کنید:
کاتلین
preference.onPreferenceChangeListener = ...
جاوا
preference.setOnPreferenceChangeListener(...);
OnSharedPreferenceChangeListener را پیاده سازی کنید
هنگامی که مقادیر Preference
با استفاده از SharedPreferences
ادامه می دهید، می توانید از SharedPreferences.OnSharedPreferenceChangeListener
نیز برای گوش دادن به تغییرات استفاده کنید. این به شما امکان میدهد به زمانی که مقادیر ذخیره شده توسط Preference
شما تغییر میکنند، مانند هنگام همگامسازی تنظیمات با یک سرور، گوش دهید. مثال زیر نشان می دهد که چگونه می توان برای تغییر مقدار یک EditTextPreference
با کلید "name"
گوش داد:
کاتلین
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, "")); } }
شنونده را با استفاده از registerOnSharedPreferenceChangedListener()
به صورت زیر ثبت کنید:
کاتلین
preferenceManager.sharedPreferences.registerOnSharedPreferenceChangeListener(...)
جاوا
getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(...);
کاتلین
val listener: SharedPreferences.OnSharedPreferenceChangeListener = SharedPreferences.OnSharedPreferenceChangeListener {...}
جاوا
SharedPreferences.OnSharedPreferenceChangeListener listener = new SharedPreferences.OnSharedPreferenceChangeListener() {...}
برای مدیریت صحیح چرخه حیات در Activity
یا Fragment
خود، همانطور که در مثال زیر نشان داده شده است، این شنونده را در فراخوانی های onResume()
و onPause()
ثبت و لغو ثبت کنید:
کاتلین
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
را گسترش دهد. مثال زیر یک Datastore ایجاد می کند که مقادیر String
مدیریت می کند:
کاتلین
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. } }
برای جلوگیری از مسدود شدن رابط کاربری، هرگونه عملیات وقت گیر را از موضوع اصلی اجرا کنید. از آنجایی که ممکن است Fragment
یا Activity
حاوی دادهاستور در حین باقی ماندن یک مقدار از بین برود، دادهها را سریال کنید تا هیچ مقداری را که کاربر تغییر داده است از دست ندهید.
دیتا استور را فعال کنید
پس از پیاده سازی datastore خود، دیتا استور جدید را در onCreatePreferences()
تنظیم کنید تا اشیاء Preference
به جای استفاده از SharedPreferences
پیش فرض، مقادیر را با datastore حفظ کنند. میتوانید برای هر Preference
یا برای کل سلسلهمراتب، یک datastore فعال کنید.
برای فعال کردن یک دیتا استور سفارشی برای یک Preference
خاص، setPreferenceDataStore()
را در Preference
فراخوانی کنید، همانطور که در مثال زیر نشان داده شده است:
کاتلین
val preference: Preference? = findPreference("key") preference?.preferenceDataStore = dataStore
جاوا
Preference preference = findPreference("key"); if (preference != null) { preference.setPreferenceDataStore(dataStore); }
برای فعال کردن یک دیتا استور سفارشی برای کل سلسله مراتب، setPreferenceDataStore()
را در PreferenceManager
فراخوانی کنید:
کاتلین
val preferenceManager = preferenceManager preferenceManager.preferenceDataStore = dataStore
جاوا
PreferenceManager preferenceManager = getPreferenceManager(); preferenceManager.setPreferenceDataStore(dataStore);
ذخیرهسازی دادهای که برای یک Preference
خاص تنظیم شده است، هر ذخیرهگاه دادهای را که برای سلسله مراتب مربوطه تنظیم شده است لغو میکند. در بیشتر موارد، شما یک دیتا استور برای کل سلسله مراتب تنظیم می کنید.