কম্পিউটার টিউটোরিয়াল

Kotlin ব্যবহার করে Android-এ Bundle দিয়ে অ্যাক্টিভিটির মধ্যে ডেটা পাস করা

ওভারভিউ

এই টিউটোরিয়ালে দেখানো হয়েছে কিভাবে 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 এড়াতে বড় ডেটা পাস করবেন না)
  1. অ্যান্ড্রয়েড SQLite-এ WHERE ক্লজ, BETWEEN এবং AND ব্যবহার করে ডেটা ফিল্টার করা

  2. অ্যান্ড্রয়েডে SQLite ব্যবহার করে ডেটা সংরক্ষণ করার পদ্ধতি

  3. অ্যান্ড্রয়েডে SharedPreferences দিয়ে ডেটা পাস করুন

  4. অ্যান্ড্রয়েডে এক্টিভিটির মাঝপথে Drawable পাস করা