অ্যান্ড্রয়েড অ্যাপ ডেভেলপমেন্টে অ্যাক্টিভিটিগুলোর মাঝপথে ডেটা আদান-প্রদান করা একটি ফান্ডামেন্টাল টাস্ক। এই আর্টিকেলে দুটি মৌলিক পদ্ধতি — স্ট্যাটিক মেথড এবং ইন্টেন্ট (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) নিচের পদ্ধতিগুলো প্রিয়:
- ViewModel + LiveData/Flow: শেয়ার্ড UI স্টেট ম্যানেজমেন্টের জন্য। এক্টিভিটি/ফ্র্যাগমেন্টের লাইফসাইকেল থেকে স্বতন্ত্র।
- Navigation Component + Safe Args: টাইপ-সেফ আর্গুমেন্ট পাসিং Gradle প্লাগইন দিয়ে অটো জেনারেট হয়।
- SharedPreferences / DataStore: ছোট পায়সিস্টেন্ট ডেটার জন্য।
- Room Database: স্ট্রাকচার্ড, কোয়েরিয়েবল বড় ডেটার জন্য।
- 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
উপরের দুটি পদ্ধতির মধ্যে ইন্টেন্ট ব্যবহার করা সেরা প্র্যাকটিস। স্ট্যাটিক মেথড শুধুমাত্র কনসেপ্ট বুঝার জন্য জানা দরকার, প্রোডাকশন কোডে এটি ব্যবহার করা উচিত নয়।