এই টিউটোরিয়ালে আমরা শিখব Activity.finish() মেথড কীভাবে কাজ করে, এটি এক্টিভিটি লাইফসাইকেলকে কীভাবে প্রভাবিত করে, এবং ব্যাক স্ট্যাক ম্যানেজমেন্টে এর ভূমিকা।
প্রয়োজনীয় ধাপগুলো
ধাপ ১: নতুন প্রজেক্ট তৈরি করুন
Android Studio-তে File → New Project এ যান এবং প্রয়োজনীয় বিবরণ পূরণ করে একটি নতুন প্রজেক্ট তৈরি করুন।
ধাপ ২: মেইন লেআউট ফাইল তৈরি করুন
res/layout/activity_main.xml ফাইলে নিচের কোড যোগ করুন:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Main Activity!"
android:layout_marginTop="25sp"
android:textSize="25dp"
android:padding="15dp" />
<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:text="Next Activity" />
</RelativeLayout>
ধাপ ৩: মেইন এক্টিভিটিতে finish() কল করুন
src/MainActivity.java ফাইলে নিচের কোড যোগ করুন:
package app.com.sample;
import android.content.Intent;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
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);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, NewActivity.class);
startActivity(intent);
finish(); // MainActivity ফিনিশ করুন
}
});
}
}
ধাপ ৪: দ্বিতীয় এক্টিভিটির লেআউট তৈরি করুন
Project → Package-এ Right click → New → Activity → Empty Activity → নাম: NewActivity
res/layout/activity_new.xml ফাইলে নিচের কোড যোগ করুন:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:app="https://schemas.android.com/apk/res-auto"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".NewActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="New Activity!"
android:textStyle="bold"
android:textColor="@color/colorAccent"
android:layout_marginTop="25sp"
android:textSize="25dp"
android:padding="15dp" />
</RelativeLayout>
ধাপ ৫: দ্বিতীয় এক্টিভিটি ক্লাস তৈরি করুন
src/NewActivity.java ফাইলে নিচের কোড যোগ করুন:
package app.com.sample;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
public class NewActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_new);
}
}
ধাপ ৬: ম্যানিফেস্টে দুটি এক্টিভিটি রেজিস্টার করুন
AndroidManifest.xml ফাইল:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
package="app.com.sample">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".NewActivity" />
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
finish() কীভাবে কাজ করে?
- এক্টিভিটি ডিস্ট্রয় করা: `finish()` কল করলে এক্টিভিটির `onDestroy()` মেথড কল হয় এবং এক্টিভিটি মেমরি থেকে মুছে যায়।
- ব্যাক স্ট্যাক থেকে মুছে ফেলা: এক্টিভিটি টাস্কের ব্যাক স্ট্যাক থেকে রিমুভ হয়।
- পূর্বের এক্টিভিটি রিজিউম: যদি ব্যাক স্ট্যাকে পূর্বের এক্টিভিটি থাকে, তবে সেটি `onRestart()` → `onStart()` → `onResume()` এ जाये।
- রেজাল্ট পাঠানো: `setResult(RESULT_OK, intent)` কল করে পূর্ণ হওয়ার আগে ডেটা পাঠানো যায়।
finish() vs finishAffinity() vs finishAndRemoveTask()
| মেথড | ব্যাখ্যা |
|---|---|
| finish() | শুধু বর্তমান এক্টিভিটি ডিস্ট্রয় করে |
| finishAffinity() | এই টাস্কের সব এক্টিভিটি ডিস্ট্রয় করে (API 16+) |
| finishAndRemoveTask() | টাস্ক রিমুভ করে এবং রিসেন্ট লিস্ট থেকে সরিয়ে দেয় (API 21+) |
সাধারণ ব্যবহারের ক্ষেত্রে
১. লগইন 후 হোম স্ক্রিনে (ব্যাক স্ট্যাক ক্লিয়ার)
Intent intent = new Intent(this, HomeActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); finish();
২. ফর্ম সাবমিশন পর প্রিভিউ স্ক্রিনে ফিরে যাওয়া
setResult(RESULT_OK, new Intent().putExtra("data", result));
finish();
৩. স্প্ল্যাশ স্ক্রিন থেকে মেইন এক্টিভিটিতে
new Handler().postDelayed(() -> {
startActivity(new Intent(this, MainActivity.class));
finish();
}, 2000);
লাইফসাইকেল কল অর্ডার
// MainActivity-এ finish() কল হলে: MainActivity: onPause() → onStop() → onDestroy() // NewActivity-এ ব্যাক প্রেস হলে (যদি MainActivity finish করা থাকে): // অ্যাপ বন্ধ হয় (হোম স্ক্রিনে ফিরে যায়)
সতর্কতা
- `finish()` অ্যাসিঙ্ক্রোনাস - তৎক্ষণ এক্টিভিটি ডিস্ট্রয় হয় না
- `finish()`-এর পরে কোড এক্সিকিউট হতে পারে, তবে UI আপডেট করবেন না
- চাইল্ড এক্টিভিটি থাকলে প্যারেন্ট `finish()` করলে চাইল্ডও ফিনিশ হয়
সারাংশ
`finish()` এক্টিভিটি ডিস্ট্রয় করে এবং ব্যাক স্ট্যাক থেকে সরিয়ে দেয়। `startActivity()`-এর পর `finish()` কল করলে ব্যবহারকারী ব্যাক প্রেস করলে অ্যাপ বন্ধ হয় (পূর্বের এক্টিভিটি নেই)। রেজাল্ট পাঠাতে `setResult()`-এর পর `finish()` কল করুন।