ওভারভিউ
এই টিউটোরিয়ালে দেখানো হয়েছে কিভাবে Bundle এবং Serializable ব্যবহার করে একাধিক ডেটা (নাম, ফোন নম্বর) এক অ্যাক্টিভিটি থেকে অন্য অ্যাক্টিভিটিতে পাস করা যায়।
প্রয়োজনীয় ধাপসমূহ
ধাপ ১: নতুন প্রজেক্ট তৈরি
ধাপ ২: activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:orientation="vertical"
android:padding="16dp"
tools:context=".MainActivity">
<EditText
android:id="@+id/etName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Enter a name"
android:inputType="text"
android:layout_marginBottom="16dp" />
<EditText
android:id="@+id/etPhone"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Enter a Phone number"
android:inputType="phone"
android:layout_marginBottom="16dp" />
<Button
android:id="@+id/btnSend"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="Send Data" />
</LinearLayout>
ধাপ ৩: MainActivity.kt
import android.content.Intent
import android.os.Bundle
import android.text.TextUtils
import android.widget.Button
import android.widget.EditText
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import java.io.Serializable
class MainActivity : AppCompatActivity() {
private lateinit var etName: EditText
private lateinit var etPhone: EditText
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
title = "Bundle Data Pass Demo"
etName = findViewById(R.id.etName)
etPhone = findViewById(R.id.etPhone)
findViewById<Button>(R.id.btnSend).setOnClickListener {
val name = etName.text.toString().trim()
val phone = etPhone.text.toString().trim()
if (TextUtils.isEmpty(name) || TextUtils.isEmpty(phone)) {
Toast.makeText(this, "Please fill all fields", Toast.LENGTH_SHORT).show()
return@setOnClickListener
}
sendUserData(name, phone)
}
}
private fun sendUserData(username: String, userPhone: String) {
val userInfo = UserInfo(username, userPhone)
val intent = Intent(this, SecondActivity::class.java)
val bundle = Bundle()
bundle.putSerializable("user_data", userInfo)
intent.putExtras(bundle)
startActivity(intent)
}
}
// Serializable ডেটা ক্লাস (Data class ব্যবহার করুন)
data class UserInfo(
val name: String,
val phone: String
) : Serializable
ধাপ ৪: SecondActivity তৈরি
activity_second.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginTop="70dp"
android:background="#008080"
android:padding="5dp"
android:text="Received Data"
android:textColor="#fff"
android:textSize="24sp"
android:textStyle="bold" />
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:textAlignment="center"
android:textColor="@android:color/holo_purple"
android:textSize="24sp"
android:textStyle="bold" />
</RelativeLayout>
SecondActivity.kt
import android.os.Bundle
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
class SecondActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_second)
title = "Received Data"
val tvData = findViewById<TextView>(R.id.textView)
// Bundle থেকে ডেটা রিট্রিভ
val userInfo = intent.getSerializableExtra("user_data") as UserInfo?
userInfo?.let {
tvData.text = "Name: ${it.name}\nPhone: ${it.phone}"
} ?: run {
tvData.text = "No data received"
}
}
}
Bundle-এ সরাসরি প্রিমিটিভ ডেটা পাস করা (Serializable ছাড়া)
সিম্পল ডেটার জন্য অবজেক্ট বানানোর প্রয়োজন নেই:
// পাঠানো
val intent = Intent(this, SecondActivity::class.java).apply {
putExtra("name", username)
putExtra("phone", userPhone)
putExtra("age", 25)
putExtra("is_active", true)
}
// পাওয়া
val name = intent.getStringExtra("name") ?: ""
val phone = intent.getStringExtra("phone") ?: ""
val age = intent.getIntExtra("age", 0)
val isActive = intent.getBooleanExtra("is_active", false)
🚀 আধুনিক পদ্ধতি: Parcelable (@Parcelize) - দ্রুত এবং টাইপ-সেফ
build.gradle.kts: `id("kotlin-parcelize")` প্লাগইন যোগ করুন।
@Parcelize
data class UserInfo(
val name: String,
val phone: String,
val age: Int = 0,
val isActive: Boolean = false
) : Parcelable
পাঠানো:
intent.putExtra("user_data", userInfo)
পাওয়া:
val userInfo = intent.getParcelableExtra("user_data")
Parcelable vs Serializable vs Bundle Primitives
| পদ্ধতি | স্পিড | ব্যবহার | সুপারিশ |
|---|---|---|---|
| Bundle primitives | সর্বোচ্চ | সিম্পল ডেটা (String, int, boolean) | ✅ সেরা ছোট ডেটার জন্য |
| @Parcelize | দ্রুত | কমপ্লেক্স অবজেক্ট, লিস্ট, নেস্টেড | ✅ সেরা অবজেক্টের জন্য |
| Serializable | ধীর | লিগ্যাসি, থার্ড পার্টি ক্লাস | ❌ এড়িয়ান |
বড় ডেটার জন্য বিকল্প
- ViewModel (Shared) - একই প্রসেসে একাধিক অ্যাক্টিভিটির মধ্যে শেয়ার
- Room Database - পারসিস্টেন্ট স্টোরেজ
- DataStore - কী-ভ্যালু / প্রোটো ডেটা
- Intent.putExtra এর লিমিট ~1MB (TransactionTooLargeException এড়াতে বড় ডেটা পাস করবেন না)