اندروید - اجرای کدها در اولین اجرای هر Activity
بعضی وقتا نیاز هست که یک عملیاتی در اولین اجرای اکتیویتی (Activity) صورت بگیره، بعنوان مثال در شرایطی که قصد دارید برای اولین بار یک راهنما رو در اکتیویتی نشون بدید.
اولین روشی که به ذهنتون خواهد رسید استفاده از SharedPreferences
هست. SharedPreferences
روشی ساده و کم هزینه برای ذخیرهی تنظیمات برنامه هست.
این تکه کد کلیدی حاوی داده ای از جنس Boolean
در SharedPreferences
ذخیره میکنه، درصورتی که کلید وجود نداشته باشه مقدار true
رو برمیگردونه و درصورت وجود، مقدار واقعی ذخیره شده در این کلید.
SharedPreferences settings = getSharedPreferences("MY_PREFERENCES", 0); final boolean ret = settings.getBoolean("activity.firstVisit", true); if (ret) { Editor editor = settings.edit(); editor.putBoolean("activity.firstVisit", false); editor.commit(); // FIRST TIME // YOUR CODES GOES HERE }
اگر فقط در یک اکتیویتی نیاز به چک کردن این موضوع داشته باشید، همین روش استفاده شده مناسب هست و شلوغی زیادی هم نداره
اما اگر نیاز باشه در چندین اکتیویتی مختلف این موضوع بررسی بشه و بر اساس اون عملیاتی انجام بشه میشه کدها رو مرتب تر کرد و از شلوغی کدها جلوگیری کرد
من عادت دارم در پروژه کلاسی مجزا ایجاد کنم که متدهایی که عمومی هستن و در کل پروژه بهشون نیاز هست رو اونجا قرار میدم. و بسته به نیازهای پروژه سعی می کنم متدها رو استاتیک تعریف کنم.
در این مورد هم میتونیم کلاسی ایجاد کنیم و این قسمت از منطق برنامه رو به کلاس مذکور منتقل کنیم. بنا به عادت اسم این کلاس رو Utils میزارم.
public class Utils { public static boolean isActivityVisitedForFirstTime(Context context) { SharedPreferences settings = context.getSharedPreferences("MY_PREFERENCES", 0); final boolean ret = settings.getBoolean(context.getClass().getName() + ".firstVisit", true); if (ret) { Editor editor = settings.edit(); editor.putBoolean(context.getClass().getName() + ".firstVisit", false); editor.commit(); } return ret; } }
ما اینجا در کلاس Utils، متدی static
تعریف کردیم که با هربار صدا زدنش در هر اکتیویتی، چک میکنه که آیا اون اکتیویتی اولین بار هست که اجرا میشه یا خیر، درواقع ما از اسم کامل هر اکتیویتی بعنوان کلید استفاده می کنیم که باعث میشه در هر اکتیویتی فقط یه متد رو صدا بزنیم و بقیه ی مسائل پنهان میشه
نکته ای که نیاز هست بهش توجه بشه این هست که بعضی متدها، مثل getSharedPreferences(...)
در محدوده ی Activity
در دسترس هستن، یعنی اگر کلاس از جنس Activity
نباشه، این متدها در دسترس نخواهند بود، برای همین نیاز هست شئ ای از جنس Context
برای این متد (یا کلاس در بردارنده ی متد) ارسال بشه تا بتونه با Activity
ی که متد رو صدا زده در ارتباط باشه
نمونه ی استفاده:
if (Utils.isActivityVisitedForFirstTime(this)) { doSomething(); }
اگر هم نیازهای پروژه به شکلی بود که احساس کردید static
تعریف کردن همه ی متدها دردسرش زیاده، میتونید متدها رو از حالت استاتیک خارج کنید و درعوض در سازندهی (Constructor) کلاس متغیرهای سراسری رو مقداردهی کنید
public class Utils { private final Context context; private Editor editor; private final SharedPreferences settings; public Utils(Context context) { this.context = context; settings = context.getSharedPreferences("MY_PREFERENCES", 0); } public boolean isActivityVisitedForFirstTime() { final boolean ret = settings.getBoolean(context.getClass().getName() + ".firstVisit", true); if (ret) { editor = settings.edit(); editor.putBoolean(context.getClass().getName() + ".firstVisit", false); editor.commit(); } return ret; } }
نمونه ی استفاده از این متد (و کلاس):
Utils utils = new Utils(this); if (utils.isActivityVisitedForFirstTime()) { doSomething(); }