اندروید راههای متنوعی برای ذخیره کردن اطلاعات برنامه معرفی کرده است. به عنوان مثال، ذخیره اطلاعات در دیتابیس، استفاده از Preference و ذخیره در فایل چند نمونه مهم از انواع ذخیره کردن اطلاغات هستند. برای ذخیره اطلاعات کم دو مورد اول توصیه میشوند و برای ذخیره اطلاعات زیاد مورد سوم توصیه شده است. در این مطلب سعی میکنم استفاده از Preference ها و کاربرد آنها را توضیح دهم. اندروید به اکتیویتی ها و برنامه ها اجازه میدهد تا اطلاعات را با فرمت Key/value نگهداری کنند. همانطور که اسم آن نشان میدهد (Preference = اولویت، ترجیح، مزیت) هدف اولیه ذخیره اطلاعاتی است که کاربر تعیین میکند، مثلاً ذخیره آخرین feedی که کاربر در feed readerوارد کرده، یا چه کاربر چه نوع sortی را برای لیست انتخاب کرده است، و هر چیز دیگر. همچنین غیر اطز این موارد شما هرچیزی که دوست داشته باشید را میتوانید در Preference ذخیره کنید (تا زمانیکه یک key بصورت رشته داشته باشید که آن هم مقدار اولیه (value) داشته باشد). Preference میتواند مستقلاً برای یک اکتیویتی تعریف شده باشد و یا بصورت اشتراکی بین سایر اکتیویتی ها باشتراک گذاشته شود. سایر کامپوننت ها، مانند سرویس ها، میتوانند با Preferenceهای اشتراکی در ارتباط باشند. آنچه نیاز داریم برای دستیابی به Preferenceها سه API وجود دارد که از میان آنها انتخاب میکنیم: ۱٫ getPreferences(): از داخل اکتیویتی، برای دسترسی به اطلاعات ذخیره شده برای همین اکتیویتی ۲٫ getSharedPreferences(): از داخل اکتیویتی (یا کانتکست های دیگر برنامه)، برای دسترسی به کل اطلاعات مربوط به برنامه ۳٫ getDefaultSharedPreferences(): از PreferenceManager، برای دسترسی به اطلاعات به اشتراک گذاشته شده. این روش با چارچوب کلی Preference اندروید هماهنگ است. در دو API اول مد امنیت اطلاعات لحاظ شده است که اینکار سبب میشود تا هیچ برنامه دیگری نتواند به اطلاعات ذخیره شده دسترسی داشته باشد. تمامی متدهای فوق نمونه ای (instance) از SharedPreferences را برمی گردانند که شامل مجموعه ای از getterها برای دسترسی به Preferenceها است (برای مثال، getBoolean() برای برگرداندن یک Preference بولی). همچنین Getterها یک مقدار پیش فرض میگیرند که اگر مقداری برای آنها در برنامه لحاظ نشده بود، آنرا برگردانند. پیشنهاد شده است تا همیشه از API نوع سوم در برنامه استفاده شود مگر دلیل خیلی خوبی برای استفاده از یکی از دو نوع اول داشته باشیم. در نوع سوم آبجکتی از نوع sharedPreferences خواهیم داشت که با PreferenceActivity بصورت پیش فرض کار میکند (در ادامه بیشتر توضیح خواهم داد). بیان کردن Preference وقتی آبجکتی از نوع SharedPreferences ساخته میشود، میتوانید از متد edit() آن بمنظور گرفتن ویرایشگر (editor) برای Preferenceها استفاده کنید. این آبجکت شامل مجموعه ای از setterها است که تمام getterها را پوشش میدهد. همچنین، این آبجکت متدهای زیر را نیز دارا می باشد: - remove(): برای پاک کردن یک عضو از Preference - Clear(): برای پاک کردن تمام اعضای Preference - Commit(): برای ثبت تغییراتی که توسط ویرایشگر انجام شده آخری از همه مهمتر است، اگر با استفاده از ویرایشگر تغییری در Preference ایجاد کنید ولی برای ثبت تغییرات از commit() استفاده نکنید، هیچکدام لحاظ نخواهد شد. دقت کنید اندروید ۲٫۳ متد apply() را معرفی کرده است که رفتاری مانند commit() دارد با این تفاوت که از آن سریعتر اجرا میشود. نکته مهم دیگر اینکه، Preference آبجکت تغییرات را بصورت زنده نگهداری خواهد کرد بدین معنی که اگر یک بخش از برنامه شما (مانند اکتیویتی) عضوی از Shared Preference را تغییر دهد، بخش دیگری از برنامه شما (مثلاً یک سرویس) از تغییر ایجاد شده بلافاصله باخبر خواهد شد. معرفی PreferenceActivity شما میتوانید اکتیویتی ای بسازید تا یکسری اطلاعات را از کاربر دریافت کند. بصورت کلی، ایده خوبی نیست. درعوض، از منابع Preference XML و PreferenceActivity میتوانیم استفاده کنیم. چرا؟ یکی از ایراداتی که برنامه نویسان به اندروید دارند فقدان نظم (discipline) است که از هیچ استاندارد یا قراردادی – که از طرف پلتفرم ایجاد شده باشد – پیروی نمیکند. فرضاً وقتی برای ویندوز برنامه مینویسیم استاندارد به این گونه است که برنامه ها منو دارند، دکمه ضربدر (X) گوشه بالایی و سمت چپ قرار میگیرد و غیره. اینکار به کاربر حس راحتی بیشتری در کارکردن با برنامه و استفاده از کامپیوتر میدهد. استفاده از PreferenceActivity برای دریافت اطلاعاتی که باید ذخیره شوند، یکی از این قراردادهاست. شما میتوانید Preferenceهای برنامه را در ساختار xml که در دایرکتوری res/xml/ قرار داده میشود، شرح دهید. اندروید میتواند محیط کاربری (UI) مطلوبی برای دریافت Preferenceها ایجاد کند که بعداً در SharedPreferences ذخیره شوند. سپس میتوانید با استفاده از متد getDefaultSharedPreferences() به آن دسترسی پیدا کنید. خب، بگذارید با مثالی گفته های بالا را بیشتر جا بیاندازیم. کد زیر نحوه تعریف preference در قالب xml را نشان میدهد: المان PreferenceScreen بعنوان روت XML معرفی شده است. در مورد چرایی انتخاب نام آن در مطالب بعدی صحبت میکنیم. اما فعلاً بخاطر بسپارید که این نام از اسامی پیش فرض است. از چیزهایی که شما میتوانید در المان PreferenceScreen داشته باشید، معرفی Preferenceها است. اینها زیرکلاسهایی از Preference هستند، مانند CheckBoxPreference یا RingtonePreference که در کد بالا نشان داده شده است. همانطور که ممکن است انتظار داشته باشید، اینها به شما اجازه میدهند تا Checkboxی را بصورت پیش فرض انتخاب کنید یا آهنگی را برای آلارم انتخاب کنید. در کیس RingtonePreference این اختیار را داریم تا به کاربر اجازه دهیم تا از ringtoneهای پیش فرض سیستم یکی از آهنگ ها را انتخاب کند و یا گزینه خاموش (silence) را انتخاب کند. اجازه دهیم کاربران انتخاب خودشان را داشته باشند تا اینجا XML Preference را تنظیم کرده ایم، حال میتوانیم از یک اکتیویتی ساخته شده (توسط اندروید) استفاده کنیم تا به کاربران اجازه دهیم تا مطابق نیازشان گزینه های ایجاد شده را تغییر دهند. این اکتیویتی بصورت ساخته شده (Built-in) از قبل است و شما نیاز دارید تا اکتیویتی خودتان را بعنوان زیرکلاسی از آن بسازید و به Preference XMLی که قبلاً ایجاد کردید اشاره کنید. کد زیر طریقه این کار را نشان میدهد. همانطور که میبینید اتفاق خاصی نیافتاده و نیاز به توضیح نیست. تمام کاری که نیاز است تا انجام شود، فراخوانی تابع addPreferencesfromResources() و معرفی منبع XMLی است که شامل Preference است. کار تمام است. این تمام کاری بود که باید انجام میشد. برنامه را که اجرا کنید باید چیزی مطابق با تصویر زیر ببینید. Checkbox بطور مستقیم میتواند تاثیر بپذیرد یعنی در حالت انتخاب قرار گیرد یا از حالت انتخاب خارج شود. برای تغییر ringtone بر روی آن کلیک کنید و یکی از دو گزینه را انتخاب کنید. دقت کنید هیچ گزینه ای یا دکمه ای برای دستور به ذخیره سازی وجود ندارد. تمام تغییرات بصورت خودکار ذخیره میشود. برای تست این موضوع تنظیمات را به میل خود تغییر دهید. سپس برنامه را ببندید و مجدداً اجرا کنید. باید تنظیماتی که انجام دادید را مشاهده کنید.