021-88881776

آموزش فعالیت ها و اهداف در Java

در این آموزش Java، ما به بررسی مفهوم و کاربردهای فعالیت‌ها و اهداف در زبان Java خواهیم پرداخت. فعالیت‌ها (Activities) و اهداف (Intents) دو جزء اصلی در توسعه اپلیکیشن‌های اندروید هستند که به کمک آن‌ها می‌توانیم تعاملات مختلف بین بخش‌های مختلف اپلیکیشن را مدیریت کنیم. این مقاله، از سطح مبتدی تا پیشرفته به بررسی این دو موضوع می‌پردازد و نحوه استفاده از آن‌ها را در پروژه‌های عملی توضیح می‌دهد.

مفهوم و چرخه حیات Activity در اندروید

در توسعه اپلیکیشن‌های اندروید با استفاده از زبان Java، Activity یک واحد بنیادی است که نمایانگر یک صفحه از رابط کاربری است و تعاملات کاربر را مدیریت می‌کند. هر Activity در حقیقت یک صفحه مستقل از اپلیکیشن است که ممکن است شامل فرم‌ها، دکمه‌ها، متون و دیگر عناصر UI باشد که کاربر با آن‌ها ارتباط برقرار می‌کند. به طور معمول، یک برنامه اندروید از چندین Activity تشکیل شده است که هر کدام مسئول وظیفه خاصی در برنامه هستند. برای مثال، یک Activity ممکن است صفحه ورود به سیستم باشد، دیگری صفحه پروفایل کاربر، و فعالیت دیگری ممکن است صفحه تنظیمات باشد.

چرخه حیات Activity در اندروید

چرخه حیات Activity به مجموعه‌ای از وضعیت‌ها یا مراحل گفته می‌شود که هر Activity از آن‌ها عبور می‌کند. این وضعیت‌ها به طور خودکار توسط سیستم عامل اندروید مدیریت می‌شوند. فهم دقیق این چرخه برای توسعه‌دهندگان بسیار مهم است، زیرا در این وضعیت‌ها باید عملیات مختلفی مانند بارگذاری داده‌ها، ذخیره‌سازی وضعیت و آزادسازی منابع انجام شود. در صورتی که این عملیات به درستی مدیریت نشوند، ممکن است منجر به مشکلاتی مانند از دست دادن داده‌ها یا مصرف زیاد منابع سیستم شود.

وضعیت‌ها و متدهای چرخه حیات Activity

onCreate()

این متد زمانی فراخوانی می‌شود که Activity برای اولین بار ایجاد می‌شود. در اینجا معمولاً تنظیمات اولیه مانند بارگذاری layout (رابط کاربری)، مقداردهی اولیه متغیرها، و راه‌اندازی منابع مختلف انجام می‌شود. این متد یکبار برای هر Activity فراخوانی می‌شود.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}

onStart()
پس از فراخوانی onCreate()، این متد زمانی اجرا می‌شود که Activity آماده به نمایش در صفحه باشد. در این مرحله، Activity هنوز قابل مشاهده است، اما تعامل با کاربر به طور کامل فعال نیست. شما معمولاً از این متد برای تنظیم نهایی قبل از نمایش Activity استفاده می‌کنید.

@Override
protected void onStart() {
    super.onStart();
    // آماده سازی نهایی قبل از نمایش
}

onResume()
این متد زمانی فراخوانی می‌شود که Activity به حالت فعال می‌آید و آماده تعامل با کاربر است. این زمان است که Activity در بالاترین سطح صفحه نمایش قرار دارد و در حال تعامل با کاربر است. این متد می‌تواند برای شروع فرآیندهایی مثل اجرای انیمیشن‌ها، بارگذاری داده‌های پویا یا اتصال به منابع آنلاین استفاده شود.

@Override
protected void onResume() {
    super.onResume();
    // شروع تعاملات با کاربر
}

onPause()
وقتی که Activity به طور موقت به حالت غیر فعال می‌رود، مثلاً کاربر به Activity دیگری می‌رود یا برنامه به حالت پس‌زمینه می‌رود، متد onPause() فراخوانی می‌شود. این زمان است که باید عملیات‌هایی مثل ذخیره وضعیت فعلی، توقف عملیات‌های سنگین و آزادسازی منابع غیرضروری انجام شوند.

@Override
protected void onPause() {
    super.onPause();
    // ذخیره داده‌ها یا متوقف کردن عملیات‌هایی که لازم نیستند
}

onStop()
زمانی که Activity از نمایشگر خارج می‌شود و دیگر قابل مشاهده نیست، متد onStop() فراخوانی می‌شود. این زمان است که می‌توانیم منابع سیستم را آزاد کنیم یا فعالیت‌های طولانی‌مدت را متوقف کنیم که نیاز به تعامل با کاربر ندارند. به‌طور معمول، عملیات‌های سنگینی که نیاز به منابع زیادی دارند باید در این مرحله متوقف شوند.

@Override
protected void onStop() {
    super.onStop();
    // آزادسازی منابع سنگین یا توقف عملیات‌ها
}

onDestroy()
این متد زمانی اجرا می‌شود که Activity به طور کامل از حافظه خارج می‌شود و دیگر نیازی به آن نیست. این متد برای آزادسازی منابعی که در طول عمر Activity استفاده کرده‌ایم، مانند اشیاء سنگین، فایل‌ها یا پایگاه‌های داده، استفاده می‌شود. به عبارت دیگر، این متد زمانی فراخوانی می‌شود که سیستم یا کاربر تصمیم می‌گیرد که Activity را حذف کند.

@Override
protected void onDestroy() {
    super.onDestroy();
    // آزادسازی منابع سنگین یا ذخیره‌سازی اطلاعات نهایی
}

مثال عملی چرخه حیات Activity

فرض کنید یک اپلیکیشن ساده داریم که یک Activity اصلی به نام MainActivity دارد و زمانی که کاربر به صفحه‌ای دیگر می‌رود، به SecondActivity هدایت می‌شود. در این حالت، هر Activity باید با توجه به چرخه حیات خود، وضعیت اپلیکیشن را مدیریت کند.

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d("MainActivity", "onCreate");
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.d("MainActivity", "onStart");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d("MainActivity", "onResume");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.d("MainActivity", "onPause");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.d("MainActivity", "onStop");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d("MainActivity", "onDestroy");
    }
}

در این کد، با استفاده از Log.d وضعیت مختلف Activity در هر مرحله از چرخه حیات چاپ می‌شود. این اطلاعات به شما کمک می‌کند تا بفهمید که کجا نیاز به مدیریت منابع یا داده‌ها دارید.

اهمیت درک چرخه حیات Activity

درک درست چرخه حیات Activity به شما این امکان را می‌دهد که برنامه‌هایی پایدار و کارآمد بسازید که به‌درستی منابع را مدیریت کنند. این امر به‌ویژه در هنگام کار با داده‌های حساس، تعاملات طولانی‌مدت و مصرف منابع سیستم (مانند حافظه و پردازنده) اهمیت زیادی دارد. اگر چرخه حیات Activity‌ها به درستی مدیریت نشود، ممکن است منجر به مشکلاتی مانند کرش‌های ناخواسته، از دست دادن داده‌ها، و یا مصرف بی‌رویه منابع سیستم شود.

در مجموع، مدیریت صحیح چرخه حیات Activity یکی از مهم‌ترین جنبه‌های برنامه‌نویسی در اندروید است که به توسعه‌دهندگان کمک می‌کند تا اپلیکیشن‌هایی روان، پایدار و بهینه ایجاد کنند.

ایجاد و مدیریت Activities در اندروید

در محیط توسعه اندروید، Activity یک بخش اصلی از اپلیکیشن است که رابط کاربری را نمایش می‌دهد و تعاملات کاربر را مدیریت می‌کند. هر اپلیکیشن اندروید معمولاً از چندین Activity تشکیل شده است که هر کدام مسئول انجام وظیفه خاصی هستند. برای مثال، ممکن است یک Activity برای صفحه ورود، یک Activity دیگر برای صفحه اصلی، و Activity دیگری برای نمایش جزئیات محصول استفاده شود.

در این بخش، به نحوه ایجاد و مدیریت Activity‌ها در اندروید پرداخته خواهد شد.

1. ایجاد یک Activity جدید

برای ایجاد یک Activity جدید، باید یک کلاس جدید در پروژه اندروید خود بسازید که از کلاس پایه‌ی Activity یا یکی از زیرکلاس‌های آن (مثل AppCompatActivity) ارث‌بری کند. اگر از AppCompatActivity استفاده کنید، می‌توانید از ویژگی‌هایی مانند پشتیبانی از ابزار بار (Toolbar) و قابلیت‌های جدیدتری که در نسخه‌های اخیر اندروید ارائه شده‌اند بهره‌مند شوید.

در اینجا نحوه ایجاد یک Activity جدید را به طور ساده توضیح می‌دهیم:

یک کلاس جدید بسازید که از AppCompatActivity ارث‌بری کند.
متد onCreate() را پیاده‌سازی کنید، که اولین متدی است که هنگام ایجاد Activity فراخوانی می‌شود.
در داخل onCreate()، از متد setContentView() برای تنظیم رابط کاربری (UI) این Activity استفاده کنید.
مثال ساده از ایجاد یک Activity جدید

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);  // رابط کاربری این Activity را به صفحه اختصاص دهید
    }
}

در این کد، به محض ایجاد MainActivity، متد onCreate() فراخوانی می‌شود. در این متد، از setContentView() برای تعیین فایل layout که مشخص می‌کند این Activity چه محتوایی را به کاربر نمایش دهد، استفاده می‌کنیم. فایل activity_main.xml که در پوشه res/layout قرار دارد، حاوی تمام اجزای رابط کاربری (مثل دکمه‌ها، فیلدهای متنی و غیره) است.

2. تنظیم رابط کاربری (UI) برای Activity

هر Activity در اندروید معمولاً شامل یک رابط کاربری است که توسط فایل‌های XML (در پوشه res/layout) تعریف می‌شود. فایل‌های XML رابط کاربری، ساختار اجزای مختلف صفحه (مثل Button، TextView، ImageView و غیره) را مشخص می‌کنند.

برای مثال، اگر بخواهید یک دکمه و یک فیلد متنی در Activity خود داشته باشید، می‌توانید یک فایل XML مشابه زیر بسازید:

activity_main.xml (در پوشه res/layout):

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    
    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Click me"
        android:layout_centerInParent="true"/>
    
    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello, World!"
        android:layout_below="@id/button"
        android:layout_centerHorizontal="true"/>
</RelativeLayout>

در اینجا، یک Button و یک TextView طراحی کرده‌ایم. وقتی که MainActivity راه‌اندازی می‌شود، این رابط کاربری به طور خودکار به نمایش در می‌آید.

3. مدیریت تعاملات کاربر در Activity

برای مدیریت تعاملات کاربر (مانند کلیک کردن روی دکمه‌ها، وارد کردن متن و غیره)، باید از کدهای مربوطه در متد onCreate() استفاده کنید.

به عنوان مثال، برای اضافه کردن عملکرد به دکمه‌ای که در activity_main.xml تعریف کرده‌ایم، می‌توانیم در MainActivity از کد زیر استفاده کنیم:

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // یافتن دکمه و فیلد متنی
        Button button = findViewById(R.id.button);
        TextView textView = findViewById(R.id.textView);

        // تنظیم عملکرد دکمه
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                textView.setText("Button clicked!");  // تغییر متن فیلد متنی
            }
        });
    }
}

در اینجا، ابتدا دکمه و فیلد متنی را با استفاده از findViewById() پیدا می‌کنیم. سپس برای دکمه یک OnClickListener تعیین می‌کنیم که در صورت کلیک روی دکمه، متن فیلد متنی تغییر کند.

4. مدیریت ناوبری بین Activities

برای ناوبری بین Activities مختلف، از Intents استفاده می‌کنیم. به عبارت دیگر، اگر بخواهید از MainActivity به SecondActivity بروید، از Intent برای انتقال به Activity دیگر استفاده خواهید کرد.

مثال از استفاده از Intent برای ناوبری:
ابتدا یک Activity جدید به نام SecondActivity بسازید.

public class SecondActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
    }
}

سپس در MainActivity از یک Intent برای فراخوانی SecondActivity استفاده کنید:

Button button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent intent = new Intent(MainActivity.this, SecondActivity.class);
        startActivity(intent);  // شروع SecondActivity
    }
});

در اینجا، هنگامی که کاربر روی دکمه کلیک می‌کند، MainActivity به SecondActivity منتقل می‌شود.

5. حذف یک Activity از پشته (Back Stack)

وقتی که یک Activity به Activity دیگری منتقل می‌شود، Activity قبلی در پشته (Back Stack) ذخیره می‌شود و کاربر می‌تواند با دکمه برگشت (Back) به آن بازگردد. اگر بخواهید یک Activity را به طور دائم از پشته حذف کنید، می‌توانید از متد finish() استفاده کنید.

@Override
protected void onDestroy() {
    super.onDestroy();
    finish();  // Activity را از پشته حذف کنید
}

6. مدیریت وضعیت Activity‌ها

یکی از ویژگی‌های مهم در مدیریت Activity‌ها، ذخیره‌سازی وضعیت آن‌ها هنگام تغییرات ناگهانی است. برای مثال، اگر دستگاه چرخیده یا اپلیکیشن به حالت پس‌زمینه رفته باشد، باید وضعیت Activity حفظ شود.

برای این کار می‌توان از متدهای onSaveInstanceState() و onRestoreInstanceState() استفاده کرد.

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putString("key", "value");  // ذخیره وضعیت Activity
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    String value = savedInstanceState.getString("key");  // بازیابی وضعیت Activity
}

در این بخش، مراحل ایجاد و مدیریت Activity‌ها در اندروید را بررسی کردیم. از ایجاد یک Activity جدید تا مدیریت تعاملات کاربر و ناوبری بین Activity‌ها، همه این مراحل به توسعه‌دهندگان کمک می‌کند تا اپلیکیشن‌های اندروید کارآمد و قابل استفاده بسازند. همچنین، مدیریت وضعیت و حفظ تجربه کاربری در هنگام تغییرات محیطی یکی از مهارت‌های ضروری در این فرآیند است.

استفاده از Intents برای انتقال داده‌ها بین Activities در اندروید

در اندروید، Intents ابزارهایی قدرتمند برای برقراری ارتباط بین مختلف بخش‌های اپلیکیشن (مثل Activity‌ها، سرویس‌ها و پخش‌کننده‌ها) هستند. با استفاده از Intents می‌توان اطلاعات (داده‌ها) را از یک Activity به Activity دیگر ارسال کرد یا حتی یک سرویس را فراخوانی نمود. در اینجا به نحوه ارسال و دریافت داده‌ها بین Activity‌ها با استفاده از Intents پرداخته خواهد شد.

مفهوم Intents در اندروید

یک Intent در اندروید به معنای قصد انجام یک عملیات است، به عنوان مثال، باز کردن یک Activity جدید، ارسال داده به Activity دیگر، یا شروع یک سرویس پس‌زمینه. این ابزار نه‌تنها برای آغاز فعالیت‌ها (Activities) به کار می‌رود، بلکه برای ارسال داده‌ها و اجرای عملیات‌ها نیز استفاده می‌شود. این ابزار به‌ویژه برای انتقال داده‌ها بین Activity‌ها و حتی بین اپلیکیشن‌های مختلف در سیستم عامل اندروید کاربرد دارد.

انواع Intents

در اندروید دو نوع اصلی Intent وجود دارد:

Explicit Intent: برای مشخص کردن دقیقی که به کدام Activity یا سرویس می‌خواهید منتقل شوید، استفاده می‌شود. معمولاً این نوع Intent برای انتقال داده‌ها به Activity‌های داخلی اپلیکیشن خود استفاده می‌شود.

Implicit Intent: زمانی استفاده می‌شود که شما دقیقاً مشخص نمی‌کنید که داده‌ها به کدام Activity یا سرویس باید ارسال شود. سیستم عامل اندروید یک انتخاب مناسب از Activity‌ها یا سرویس‌ها برای شما انجام می‌دهد که قادر به انجام عملیات مورد نظر شما باشد.

ارسال داده‌ها با استفاده از Intent

برای انتقال داده‌ها بین Activity‌ها، می‌توانید از متد putExtra() استفاده کنید تا داده‌ها را به Intent اضافه کنید و سپس آن را به Activity مقصد ارسال کنید. این داده‌ها می‌توانند انواع مختلفی از داده‌ها (مثل رشته‌ها، اعداد و …) باشند.

مراحل ارسال داده‌ها از یک Activity به Activity دیگر
ابتدا یک Intent جدید برای انتقال به Activity مقصد ایجاد می‌کنید.
با استفاده از متد putExtra() داده‌ها را به Intent اضافه می‌کنید.
در نهایت، با استفاده از متد startActivity()، این Intent را به Activity مقصد ارسال می‌کنید.

مثال: ارسال داده‌ها از MainActivity به SecondActivity

در MainActivity، قصد داریم داده‌ای را از طریق Intent به SecondActivity ارسال کنیم:

// MainActivity.java
Intent intent = new Intent(MainActivity.this, SecondActivity.class);  // ایجاد Intent برای SecondActivity
intent.putExtra("key", "Hello, SecondActivity!");  // ارسال داده با استفاده از putExtra
startActivity(intent);  // انتقال به SecondActivity

در اینجا، داده‌ای با کلید “key” و مقدار “Hello, SecondActivity!” به Intent اضافه می‌شود و به SecondActivity ارسال می‌شود.

دریافت داده‌ها در Activity مقصد

پس از ارسال داده‌ها با استفاده از Intent، در Activity مقصد (در اینجا SecondActivity) باید داده‌ها را دریافت کنید. برای این کار، از متد getIntent() برای گرفتن Intent فرستاده شده به Activity و سپس از متدهای مناسب برای دریافت داده‌ها استفاده می‌کنید.

دریافت داده‌ها در SecondActivity

// SecondActivity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_second);
    
    // دریافت Intent و استخراج داده
    String value = getIntent().getStringExtra("key");  // دریافت داده با استفاده از کلید "key"
    
    // نمایش داده دریافتی
    Log.d("SecondActivity", "Received value: " + value);
}

در اینجا، متد getIntent() به شما اجازه می‌دهد که Intent فرستاده شده به SecondActivity را دریافت کنید. سپس از متد getStringExtra(“key”) برای دریافت داده‌ای که با کلید “key” ارسال شده، استفاده می‌کنید. در این مثال، داده “Hello, SecondActivity!” دریافت خواهد شد.

ارسال انواع مختلف داده‌ها

همانطور که در بالا اشاره کردیم، می‌توانید انواع مختلف داده‌ها را با استفاده از putExtra ارسال کنید. در اینجا به برخی از انواع داده‌های قابل ارسال در Intent‌ها اشاره می‌کنیم:

String:

intent.putExtra("key", "Hello");

int:

intent.putExtra("age", 25);

boolean:

intent.putExtra("isActive", true);

ArrayList:

ArrayList<String> list = new ArrayList<>();
list.add("Item 1");
list.add("Item 2");
intent.putStringArrayListExtra("listKey", list);

Parcelable: برای ارسال شیء‌های پیچیده مانند مدل‌های داده‌ای (objects)، می‌توانید از Parcelable استفاده کنید. در این صورت باید مدل داده‌ای را به صورت Parcelable تعریف کنید.

// ارسال شیء Parcelable
MyObject myObject = new MyObject();
intent.putExtra("myObjectKey", myObject);

استفاده از Intent برای ارسال داده‌های پیچیده‌تر (Parcelable)

در مواردی که می‌خواهید داده‌هایی پیچیده‌تر از انواع داده‌های ساده (مانند String یا int) ارسال کنید، می‌توانید از Parcelable یا Serializable برای ارسال اشیاء استفاده کنید.

مثال: ارسال شیء با استفاده از Parcelable

فرض کنید که یک کلاس مدل به نام User دارید که می‌خواهید آن را به Activity دیگری ارسال کنید:

// کلاس User که Parcelable را پیاده‌سازی می‌کند
public class User implements Parcelable {
    private String name;
    private int age;

    // سازنده و متدهای مورد نیاز برای Parcelable

    protected User(Parcel in) {
        name = in.readString();
        age = in.readInt();
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        dest.writeInt(age);
    }

    public static final Creator<User> CREATOR = new Creator<User>() {
        @Override
        public User createFromParcel(Parcel in) {
            return new User(in);
        }

        @Override
        public User[] newArray(int size) {
            return new User[size];
        }
    };
}

سپس می‌توانید یک شیء User را به Activity دیگری ارسال کنید:

// ارسال شیء User
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
User user = new User("John", 30);
intent.putExtra("userKey", user);
startActivity(intent);

در SecondActivity، برای دریافت شیء ارسال‌شده از Parcelable استفاده می‌کنید:

// دریافت شیء User
User user = getIntent().getParcelableExtra("userKey");
Log.d("SecondActivity", "Received User: " + user.getName());

استفاده از Implicit Intents برای انتقال داده‌ها

در بسیاری از مواقع، به جای ارسال داده‌ها به یک Activity خاص، ممکن است بخواهید داده‌ها را به یکی از چندین Activity که قابلیت انجام کاری خاص را دارند ارسال کنید. برای این کار از Implicit Intents استفاده می‌شود.

برای مثال، اگر بخواهید داده‌ای را برای ارسال ایمیل به کاربر ارسال کنید، می‌توانید از یک Implicit Intent برای باز کردن اپلیکیشن ایمیل دستگاه استفاده کنید.

Intent emailIntent = new Intent(Intent.ACTION_SEND);
emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[]{"user@example.com"});
emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Test Email");
emailIntent.putExtra(Intent.EXTRA_TEXT, "Hello, this is a test email.");
emailIntent.setType("message/rfc822");  // تعیین نوع محتوا به ایمیل
startActivity(Intent.createChooser(emailIntent, "Choose an Email client"));

این Intent به سیستم‌عامل اندروید اجازه می‌دهد که مناسب‌ترین اپلیکیشن (مثلاً Gmail یا Outlook) را برای ارسال ایمیل انتخاب کند.

استفاده از Intents برای انتقال داده‌ها بین Activity‌ها یکی از روش‌های اصلی در اندروید است که به توسعه‌دهندگان این امکان را می‌دهد تا ارتباطات و تعاملات پیچیده بین بخش‌های مختلف اپلیکیشن خود را مدیریت کنند. این ابزار به سادگی داده‌ها را ارسال و دریافت می‌کند و قابلیت‌های زیادی برای ارسال انواع داده‌ها (از داده‌های ساده تا داده‌های پیچیده و Parcelable) فراهم می‌کند.

مدیریت Activity Lifecycle (onCreate, onStart, onResume, onPause, onStop, onDestroy)

درک کامل از چرخه حیات Activity در اندروید برای مدیریت صحیح وضعیت برنامه و جلوگیری از مشکلاتی مانند مصرف بی‌رویه منابع، از دست رفتن داده‌ها یا crash شدن اپلیکیشن ضروری است. هر Activity در اندروید یک سری متدهای خاص دارد که به ترتیب در طول زندگی آن Activity فراخوانی می‌شوند و به شما این امکان را می‌دهند که منابع را مدیریت کرده و تجربه کاربری بهتری فراهم کنید.

در این بخش، به بررسی مفصل متدهای مختلف چرخه حیات Activity و نحوه استفاده از آن‌ها می‌پردازیم.

1. onCreate(): اولین فراخوانی و تنظیم منابع اولیه

متد onCreate() زمانی فراخوانی می‌شود که Activity برای اولین بار ایجاد می‌شود. این متد معمولاً برای تنظیم رابط کاربری و بارگذاری منابع اولیه مانند layout، متغیرها، داده‌ها و اجزای مختلف UI استفاده می‌شود. این متد به‌طور معمول برای انجام تنظیمات اولیه Activity، مثل نصب لیسنرها، راه‌اندازی View‌ها و انجام وظایف اولیه (مثل بارگذاری داده‌ها از دیتابیس یا فایل) کاربرد دارد.

کاربردها:
بارگذاری رابط کاربری با استفاده از setContentView().
تنظیم متغیرهای اولیه و ایجاد اشیاء.
راه‌اندازی لیسنرهای رویداد (مثل دکمه‌ها و دیگر View‌ها).
بازیابی وضعیت قبلی از savedInstanceState در صورت نیاز.
مثال:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main); // بارگذاری layout
    // تنظیمات اولیه
    Button myButton = findViewById(R.id.my_button);
    myButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // انجام عملیاتی مثل تغییر متن یا ارسال درخواست
        }
    });
}

2. onStart(): آماده‌سازی برای نمایش به کاربر

متد onStart() زمانی فراخوانی می‌شود که Activity به نمایان شدن نزدیک می‌شود. این متد برای انجام کارهایی که نیاز به آماده‌سازی Activity قبل از نمایش دارند، استفاده می‌شود. معمولاً از این متد برای انجام کارهایی مانند تنظیم View‌های داینامیک یا شروع انیمیشن‌ها استفاده می‌شود.

کاربردها:
تنظیم یا تغییر View‌هایی که نیاز به بروزرسانی دارند.
شروع عملیات‌های نمایشگر مانند انیمیشن‌ها یا تغییرات UI.
انجام کارهای مربوط به نما (display) که باید قبل از شروع تعامل با کاربر انجام شوند.
مثال:

@Override
protected void onStart() {
    super.onStart();
    // شروع انیمیشن یا بروزرسانی وضعیت UI
    Log.d("MainActivity", "Activity is starting.");
}

3. onResume(): فعالیت کامل و تعامل با کاربر

متد onResume() زمانی فراخوانی می‌شود که Activity کاملاً آماده تعامل با کاربر باشد. این متد زمانی فراخوانی می‌شود که Activity در حالت فعال قرار دارد و به محض اینکه Activity قابل مشاهده شد و کاربر می‌تواند با آن تعامل کند، این متد اجرا می‌شود.

کاربردها:
انجام کارهایی که فقط زمانی باید انجام شوند که Activity در حال تعامل با کاربر است (مثل شروع انیمیشن‌های زنده یا پخش ویدئو).
ادامه دادن عملیات‌هایی که در حالت غیر فعال به تعویق افتاده‌اند.
بازیابی یا ادامه عملکردهایی که در زمان متوقف شدن یا پنهان شدن Activity متوقف شده‌اند.
مثال:

@Override
protected void onResume() {
    super.onResume();
    // شروع پخش ویدیو یا انیمیشن
    Log.d("MainActivity", "Activity has resumed and is now interacting with the user.");
}

4. onPause(): توقف فعالیت و ذخیره وضعیت

متد onPause() زمانی فراخوانی می‌شود که Activity به حالت غیر فعال در می‌آید، یعنی وقتی کاربر به Activity دیگری می‌رود یا صفحه نمایش خاموش می‌شود. این متد فرصت مناسبی است برای ذخیره وضعیت یا متوقف کردن عملیات‌هایی که نیاز به تعامل با کاربر دارند (مثل انیمیشن‌ها یا پخش ویدئو).

کاربردها:
ذخیره وضعیت‌های مهم (مثلاً داده‌هایی که ممکن است تغییر کرده باشند).
توقف عملیات‌هایی که به تعامل کاربر وابسته هستند (مثل توقف انیمیشن‌ها، متوقف کردن پخش رسانه یا رد تماس‌های ورودی).
آزادسازی منابعی که برای نمایش یا فعالیت ضروری نیستند.
مثال:

@Override
protected void onPause() {
    super.onPause();
    // ذخیره وضعیت یا توقف عملیات‌هایی که نیاز به تعامل دارند
    Log.d("MainActivity", "Activity is paused.");
}

5. onStop(): غیرفعال شدن کامل Activity

متد onStop() زمانی فراخوانی می‌شود که Activity دیگر قابل مشاهده نیست. این می‌تواند زمانی باشد که Activity به یک Activity دیگر منتقل می‌شود یا اپلیکیشن به پس‌زمینه می‌رود. در این مرحله، شما باید منابعی را که دیگر مورد نیاز نیستند آزاد کنید.

کاربردها:
آزادسازی منابعی که فقط برای زمان نمایش Activity نیاز بودند (مثل فایل‌ها یا اتصالات شبکه).
انجام عملیات‌های طولانی‌مدت که ممکن است در پس‌زمینه انجام شوند.
حفظ داده‌ها و وضعیت‌های اپلیکیشن برای بازیابی در دفعات بعدی.
مثال:

@Override
protected void onStop() {
    super.onStop();
    // آزادسازی منابع اضافی
    Log.d("MainActivity", "Activity is stopped and no longer visible.");
}

6. onDestroy(): پایان عمر Activity و آزادسازی منابع

متد onDestroy() زمانی فراخوانی می‌شود که Activity از بین می‌رود و حذف می‌شود (مثلاً وقتی که کاربر به صفحه دیگری می‌رود و Activity از حافظه حذف می‌شود). این مرحله نهایی در چرخه حیات Activity است و زمانی است که شما باید همه منابعی که در Activity استفاده کرده‌اید، آزاد کنید تا از بروز نشت حافظه (memory leaks) جلوگیری کنید.

کاربردها:
آزادسازی منابع سنگین مانند پردازش‌ها یا سرویس‌ها.
لغو درخواست‌های شبکه یا توقف خدمات پس‌زمینه.
اطمینان از پاکسازی نهایی منابع برای جلوگیری از نشت حافظه.
مثال:

@Override
protected void onDestroy() {
    super.onDestroy();
    // آزادسازی منابع و پاکسازی
    Log.d("MainActivity", "Activity is being destroyed.");
}

چگونگی مدیریت وضعیت Activity‌ها در هنگام تغییرات

یکی از چالش‌های بزرگ در مدیریت چرخه حیات Activity‌ها، اطمینان از حفظ وضعیت‌ها در مواقع تغییرات مختلف است (مانند چرخش صفحه نمایش، تغییر وضعیت دستگاه یا برگشت به صفحه قبلی). برای حل این مشکل، می‌توانید از روش‌های زیر استفاده کنید:

onSaveInstanceState(): برای ذخیره وضعیت‌های موقت Activity‌ها هنگام تغییرات (مثل چرخش صفحه نمایش) استفاده می‌شود.

onRestoreInstanceState(): برای بازیابی وضعیت‌ها هنگام بازگشت به Activity استفاده می‌شود.

مثال:

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putString("user_data", "some_value");
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    String userData = savedInstanceState.getString("user_data");
    Log.d("MainActivity", "Restored data: " + userData);
}

مدیریت دقیق چرخه حیات Activity‌ها در اندروید به شما این امکان را می‌دهد که منابع سیستم را بهینه استفاده کنید و تجربه کاربری بهتری ایجاد کنید. هرکدام از متدهای onCreate(), onStart(), onResume(), onPause(), onStop() و onDestroy() کاربردهای خاص خود را دارند و استفاده درست از آن‌ها در شرایط مختلف می‌تواند به اپلیکیشن شما کمک کند تا به‌طور مؤثری عمل کند و به راحتی با تغییرات وضعیت دستگاه کنار بیاید.

کار با Implicit Intents و Explicit Intents

در اندروید، Intents ابزارهایی هستند که برای ارسال درخواست‌ها (مثل درخواست برای شروع یک Activity، سرویس، یا ارسال داده‌ها) استفاده می‌شوند. Intents در اندروید به دو نوع Explicit و Implicit تقسیم می‌شوند که هرکدام کاربردهای خاص خود را دارند. در این بخش، به تفاوت‌ها و کاربردهای هر دو نوع از Intent‌ها پرداخته می‌شود.

1. Explicit Intent: اشاره مستقیم به Activity یا سرویس خاص

Explicit Intents زمانی استفاده می‌شوند که شما به طور مستقیم یک Activity یا سرویس خاص را هدف قرار می‌دهید. در این حالت، شما دقیقاً مشخص می‌کنید که کدام Activity یا سرویس قرار است اجرا شود. این نوع از Intent معمولاً در برنامه‌هایی که بین Activity‌های خود تعامل دارند استفاده می‌شود.

نحوه استفاده از Explicit Intent

برای ایجاد یک Explicit Intent، شما باید کلاس مقصد را مشخص کنید. به عنوان مثال، اگر می‌خواهید از MainActivity به SecondActivity بروید، به شکل زیر عمل می‌کنید:

// ایجاد Explicit Intent
Intent intent = new Intent(MainActivity.this, SecondActivity.class);

// شروع Activity مقصد
startActivity(intent);

در این کد:

MainActivity.this: اشاره به Context فعلی، یعنی Activity جاری.
SecondActivity.class: کلاس Activity مقصد.
startActivity(intent): فراخوانی Activity مقصد.
مثال‌های کاربردی:
انتقال به Activity دیگر: فرض کنید شما یک فرم دارید و بعد از تکمیل آن می‌خواهید کاربر را به صفحه تأیید هدایت کنید. در اینجا از Explicit Intent برای انتقال از صفحه فرم به صفحه تأیید استفاده می‌کنید.

استفاده از سرویس‌ها: اگر نیاز به شروع یک سرویس خاص دارید، می‌توانید از Explicit Intent استفاده کنید. برای مثال:

Intent serviceIntent = new Intent(MainActivity.this, MyService.class);
startService(serviceIntent);

 

2. Implicit Intent: فراخوانی غیرمستقیم Activity یا سرویس

Implicit Intents زمانی استفاده می‌شوند که شما به طور غیرمستقیم درخواست انجام یک عملیات خاص را ارسال می‌کنید و سیستم اندروید تصمیم می‌گیرد که کدام Activity یا سرویس برای انجام این عملیات مناسب است. در این نوع از Intent، شما عملیات خاصی را مشخص می‌کنید (مثل باز کردن یک URL یا ارسال پیام) و سیستم اندروید انتخاب می‌کند که کدام اپلیکیشن قادر به انجام این عملیات است.

نحوه استفاده از Implicit Intent

برای استفاده از Implicit Intent، شما معمولاً از یک Action خاص (مثل ACTION_VIEW, ACTION_SEND, ACTION_DIAL) و گاهی اوقات از URI برای مشخص کردن هدف عملیات استفاده می‌کنید. به عنوان مثال، اگر بخواهید یک URL را در مرورگر باز کنید، از Implicit Intent به صورت زیر استفاده می‌کنید:

// ایجاد Implicit Intent برای باز کردن URL در مرورگر
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.example.com"));
startActivity(intent);

در این کد:

Intent.ACTION_VIEW: نشان‌دهنده عملی است که می‌خواهیم انجام دهیم (در اینجا، مشاهده یک URL).
Uri.parse(“http://www.example.com”): URL مورد نظر برای باز شدن در مرورگر.
startActivity(intent): سیستم اندروید از میان تمامی اپلیکیشن‌های نصب‌شده، مناسب‌ترین اپلیکیشن را برای نمایش URL انتخاب می‌کند (در اینجا احتمالاً مرورگر وب دستگاه).
مثال‌های کاربردی:
ارسال ایمیل با استفاده از Implicit Intent: اگر بخواهید کاربر را برای ارسال ایمیل هدایت کنید، می‌توانید از Intent.ACTION_SEND برای ارسال ایمیل استفاده کنید:

Intent emailIntent = new Intent(Intent.ACTION_SEND);
emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[]{"recipient@example.com"});
emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Test Subject");
emailIntent.putExtra(Intent.EXTRA_TEXT, "This is a test email.");
emailIntent.setType("message/rfc822");  // نوع محتوا برای ایمیل
startActivity(Intent.createChooser(emailIntent, "Choose an Email client"));

در اینجا، سیستم اندروید مناسب‌ترین اپلیکیشن ایمیل را برای ارسال ایمیل انتخاب می‌کند، مثلاً Gmail، Outlook و غیره.

برقراری تماس تلفنی: برای باز کردن برنامه تماس و شماره‌گیری یک شماره، از Intent.ACTION_DIAL استفاده می‌شود:

Intent dialIntent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:+123456789"));
startActivity(dialIntent);

در اینجا سیستم اندروید یک اپلیکیشن مناسب برای شماره‌گیری باز می‌کند (مثل اپلیکیشن تماس دستگاه).

نمایش نقشه با موقعیت جغرافیایی مشخص: برای نمایش یک موقعیت روی نقشه گوگل، می‌توان از Implicit Intent به صورت زیر استفاده کرد:

Uri location = Uri.parse("geo:37.7749,-122.4194");  // مختصات مکانی
Intent mapIntent = new Intent(Intent.ACTION_VIEW, location);
mapIntent.setPackage("com.google.android.apps.maps"); // مشخص کردن اپلیکیشن مقصد (اختیاری)
startActivity(mapIntent);

تفاوت‌های کلیدی بین Explicit Intents و Implicit Intents:

هدف‌گذاری:

Explicit Intent: شما دقیقاً مشخص می‌کنید که کدام Activity یا سرویس اجرا شود.
Implicit Intent: شما فقط عملیات را مشخص می‌کنید و سیستم اندروید تصمیم می‌گیرد که کدام Activity یا سرویس باید این عملیات را انجام دهد.
زمان استفاده:

Explicit Intent: زمانی که می‌خواهید به Activity یا سرویس خاصی بروید (مثلاً در میان Activity‌های داخلی اپلیکیشن خود).
Implicit Intent: زمانی که می‌خواهید به سیستمی غیر از اپلیکیشن خود (مثل مرورگر وب، اپلیکیشن ایمیل یا نقشه) دسترسی داشته باشید.
جزئیات مقصد:

Explicit Intent: شما باید مقصد را مشخص کنید.
Implicit Intent: مقصد به طور غیرمستقیم از طریق Action و URI مشخص می‌شود.

Explicit Intents و Implicit Intents هرکدام کاربرد خاص خود را دارند و باید بسته به نیاز اپلیکیشن از آن‌ها استفاده کرد. در Explicit Intents شما دقیقاً هدف را مشخص می‌کنید، در حالی که در Implicit Intents، سیستم اندروید مسئول انتخاب فعالیت یا سرویس مناسب است. درک و استفاده صحیح از این دو نوع Intent باعث می‌شود که اپلیکیشن شما بتواند به‌خوبی با سایر اپلیکیشن‌ها و سرویس‌های سیستم عامل اندروید تعامل داشته باشد.

نتیجه‌گیری

در این مقاله، به بررسی و توضیح انواع فعالیت ها و اهداف در java پرداختیم که از ابزارهای مهم در توسعه برنامه‌های اندروید هستند. ما دو نوع اصلی از Intentها، یعنی Explicit Intent و Implicit Intent را بررسی کردیم و کاربردها و تفاوت‌های آن‌ها را در شرایط مختلف شرح دادیم.

با استفاده از Explicit Intent می‌توانید به طور دقیق به یک Activity یا سرویس خاص اشاره کنید، در حالی که Implicit Intent به شما این امکان را می‌دهد که بدون مشخص کردن مقصد، تنها عملیات مورد نظر را تعریف کرده و سیستم اندروید مناسب‌ترین اپلیکیشن برای انجام آن عملیات را انتخاب کند.

درک و استفاده صحیح از این مفاهیم، به شما این امکان را می‌دهد که بتوانید تعاملات کاربری پیچیده‌تری را در اپلیکیشن‌های اندرویدی خود ایجاد کنید و از قدرت سیستم عامل اندروید برای ارتباط با دیگر اپلیکیشن‌ها بهره‌مند شوید. به طور کلی، فعالیت ها و اهداف در java بخش اساسی از معماری برنامه‌های اندروید است که هر توسعه‌دهنده باید به خوبی آن‌ها را درک کرده و به‌طور مؤثر در پروژه‌های خود پیاده‌سازی کند.

با توجه به اهمیت این موضوع، مطالعه بیشتر در مورد فعالیت ها و اهداف در java می‌تواند به شما کمک کند تا کدهای بهینه‌تری نوشته و تجربه کاربری بهتری را ارائه دهید.

آموزش فعالیت ها و اهداف در Java

دیدگاه های شما

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *