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

অ্যান্ড্রয়েডে অ্যাক্টিভিটির মাঝপথে ভ্যালু পাস করার পদ্ধতিসমূহ: স্ট্যাটিক মেথড ও ইন্টেন্ট

অ্যান্ড্রয়েড অ্যাপ ডেভেলপমেন্টে অ্যাক্টিভিটিগুলোর মাঝপথে ডেটা আদান-প্রদান করা একটি ফান্ডামেন্টাল টাস্ক। এই আর্টিকেলে দুটি মৌলিক পদ্ধতি — স্ট্যাটিক মেথড এবং ইন্টেন্ট (Intent) — ব্যবহার করে ডেটা পাস করার বিস্তারিত উদাহরণ দেওয়া হলো।

পদ্ধতি ১: স্ট্যাটিক মেথড ব্যবহার করা (Non-Persistent, Quick & Dirty)

এই পদ্ধতিতে সোর্স অ্যাক্টিভিটিতে একটি private static ভেরিয়েবল এবং একটি public static গেটার মেথড থাকে। ডেস্টিনেশন অ্যাক্টিভিটি সেটি কল করে ডেটা পায়।

কোড ইমপ্লিমেন্টেশন

MainActivity.java

package com.example.passvalues;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

    private static String sharedData; // স্ট্যাটিক ফিল্ড

    public static String getSharedData() {
        return sharedData;
    }

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

        final EditText editText = findViewById(R.id.edit_text);
        Button button = findViewById(R.id.button);

        button.setOnClickListener(v -> {
            sharedData = editText.getText().toString().trim();
            startActivity(new Intent(MainActivity.this, SecondActivity.class));
        });
    }
}

SecondActivity.java

package com.example.passvalues;

import android.os.Bundle;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;

public class SecondActivity extends AppCompatActivity {

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

        TextView textView = findViewById(R.id.text_view);
        textView.setText(MainActivity.getSharedData()); // স্ট্যাটিক কল
    }
}

⚠️ সতর্কতা: এই পদ্ধতির ডメリカরিট

  • মেমরি লিক: স্ট্যাটিক রেফারেন্স এক্টিভিটি গারবেজ কালেক্ট হওয়া রোধ করে।
  • প্রসেস ডেথ: সিস্টেম অ্যাপ কিল করলে ডেটা হারায়।
  • টেস্টিং কঠিন: ইউনিট টেস্টে মক করা কঠিন।
  • কানকারেন্সি ইস্যু: মাল্টি-থ্রেড এনভায়রনমেন্টে অনসেফ।

ব্যবহার করুন: শুধু প্রোটোটাইপিং, কুইক টেস্ট বা খুব ছোট অ্যাপে। প্রোডাকশনে এড়িয়ে চলুন।


পদ্ধতি ২: ইন্টেন্ট (Intent) ব্যবহার করা (Recommended Standard)

এটি অ্যান্ড্রয়েডের অফিশিয়াল এবং সবচেয়ে সুরক্ষিত পদ্ধতি। putExtra() ব্যবহার করে ডেটা ইন্টেন্টে প্যাক করা হয় এবং ডেস্টিনেশন অ্যাক্টিভিটিতে getIntent().getXxxExtra() দিয়ে রিট্রিভ করা হয়।

MainActivity.java

package com.example.passvalues;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

    // কী গুলো কনস্ট্যান্ট হিসেবে ডিক্লেয়ার করা ভালো প্র্যাকটিস
    public static final String EXTRA_MESSAGE = "com.example.passvalues.MESSAGE";

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

        final EditText editText = findViewById(R.id.edit_text);
        Button button = findViewById(R.id.button);

        button.setOnClickListener(v -> {
            String message = editText.getText().toString().trim();
            Intent intent = new Intent(MainActivity.this, SecondActivity.class);
            intent.putExtra(EXTRA_MESSAGE, message); // সঠিক পদ্ধতি
            startActivity(intent);
        });
    }
}

SecondActivity.java

package com.example.passvalues;

import android.os.Bundle;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;

public class SecondActivity extends AppCompatActivity {

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

        TextView textView = findViewById(R.id.text_view);
        
        // সেফলি রিট্রিভ করা
        String message = getIntent().getStringExtra(MainActivity.EXTRA_MESSAGE);
        textView.setText(message != null ? message : "খালি মেসেজ");
    }
}

কমন লেআউট (activity_main.xml / activity_second.xml)

দুই পদ্ধতিতেই একই লেআউট ব্যবহার করা যায় (আগের উদাহরণের মত)।


তুলনামূলক সারসংক্ষেপ

প্য্যারামিটারস্ট্যাটিক মেথডইন্টেন্ট (putExtra)
কঠিনতাখুব সহজসহজ
টাইপ সেফটিকম (Stringのみ)উচ্চ (সব প্রিমিটিভ + Parcelable)
লাইফসাইকেল সেফনहींহ্যাঁ
প্রসেস ডেথ সারভাইভনहींহ্যাঁ (সিস্টেম হ্যান্ডেল করে)
মেমরি লিক রিস্কউচ্চনিম্ন
রিকমেন্ডেশনশুধু লার্নিং/প্রোটোটাইপপ্রোডাকশন রেডি

আধুনিক এবং উন্নত বিকল্পগুলো

বর্তমান অ্যান্ড্রয়েড ডেভেলপমেন্টে (Jetpack/Modern Android Development) নিচের পদ্ধতিগুলো প্রিয়:

  1. ViewModel + LiveData/Flow: শেয়ার্ড UI স্টেট ম্যানেজমেন্টের জন্য। এক্টিভিটি/ফ্র্যাগমেন্টের লাইফসাইকেল থেকে স্বতন্ত্র।
  2. Navigation Component + Safe Args: টাইপ-সেফ আর্গুমেন্ট পাসিং Gradle প্লাগইন দিয়ে অটো জেনারেট হয়।
  3. SharedPreferences / DataStore: ছোট পায়সিস্টেন্ট ডেটার জন্য।
  4. Room Database: স্ট্রাকচার্ড, কোয়েরিয়েবল বড় ডেটার জন্য।
  5. WorkManager / Foreground Service: ব্যাকগ্রাউন্ড টাস্কে ডেটা শেয়ারিংয়ের জন্য।

সিদ্ধান্ত গাইড: কোন পদ্ধতি বেছে নেবেন?

  • সিম্পল প্রিমিটিভ ডেটা (String, int, boolean): Intent.putExtra()
  • কমপ্লেক্স অবজেক্ট (List, Custom Class): Bundle + Parcelable বা Serializable
  • শেয়ার্ড UI স্টেট (একাধিক ফ্র্যাগমেন্ট/অ্যাক্টিভিটি): ViewModel
  • পায়সিস্টেন্স প্রয়োজন: DataStore / Room
  • বড় বাইনারি ডেটা (ইমেজ, ফাইল): ContentProvider / FileProvider / URI শেয়ারিং

নামুনা প্রজেক্ট স্ট্রাকচার

com.example.passvalues
├── MainActivity.java
├── SecondActivity.java
├── res/
│   ├── layout/
│   │   ├── activity_main.xml
│   │   └── activity_second.xml
│   └── values/
│       └── strings.xml
└── AndroidManifest.xml

উপরের দুটি পদ্ধতির মধ্যে ইন্টেন্ট ব্যবহার করা সেরা প্র্যাকটিস। স্ট্যাটিক মেথড শুধুমাত্র কনসেপ্ট বুঝার জন্য জানা দরকার, প্রোডাকশন কোডে এটি ব্যবহার করা উচিত নয়।

  1. অ্যান্ড্রয়েডে ইন্টেন্ট ব্যবহার করে একটি এক্টিভিটির থেকে অন্য এক্টিভিটিতে অবজেক্ট পাঠানোর পদ্ধতি

  2. অ্যান্ড্রয়েডে এক্টিভিটির থেকে ফ্র্যাগমেন্টে ভেরিয়েবল পাস করার পদ্ধতি

  3. অ্যান্ড্রয়েডে একটি ইমেজ এক्टीভিটি থেকে অন্য এক्टीভিটিতে পাস করার পদ্ধতি

  4. Android-এ একটি ফ্র্যাগমেন্ট থেকে অন্য ফ্র্যাগমেন্টে ডেটা পাস করার পদ্ধতি