به نام خدا

سلام! بعضی وقتا نیاز هست که یک عملیاتی در اولین اجرای اکتیویتی (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();
}


یا علی مدد