এই টিউটোরিয়ালে শুধুমাত্র স্ট্যাটিক মেথড ব্যবহার করে অ্যান্ড্রয়েডের দুটি অ্যাক্টিভিটির মাঝপথে ডেটা পাস করার পদ্ধতি দেখানো হলো। এটি খুব সহজ কিন্তু প্রোডাকশন-লেভেল অ্যাপের জন্য अनुशंसিত নয়। শেখার লिहাজ থেকে এবং খুব সিম্পল ইউজ কেসের জন্য এটি উপযোগী হতে পারে।
কেন স্ট্যাটিক মেথড? (এবং কেন নয়?)
- ✅ সহজ: কোনো এক্সট্রা বয়লারপ্লেট কোড লাগে না।
- ✅ দ্রুত প্রোটোটাইপিং: কুইক টেস্টের জন্য ভালো।
- ❌ মেমরি লিক: স্ট্যাটিক রেফারেন্স এক্টিভিটি ডেস্ট্রয় না হওয়ায় মেমরি লিক করে।
- ❌ প্রসেস ডেথ: সিস্টেম প্রসেস কিল করলে ডেটা হারায়।
- ❌ নন-লাইফসাইকেল-অয়েয়ার: কনফিগারেশন চেঞ্জ (রোটেশন) হ্যান্ডেল করে না।
ইমপ্লিমেন্টেশন স্টেপস
Step 1: নতুন প্রজেক্ট তৈরি
Android Studio → File → New Project → Empty Activity → Language: Java → Finish
Step 2: 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:layout_margin="16dp"
android:orientation="vertical"
tools:context=".MainActivity">
<EditText
android:id="@+id/edit_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:hint="পাস করার টেক্সট লিখুন"
android:inputType="text" />
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="16dp"
android:text="Next" />
</LinearLayout>
Step 3: MainActivity.java
package com.example.staticdatapass;
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 dataHolder;
// পাবলিক স্ট্যাটিক গেটার - অন্য ক্লাস থেকে এক্সেসের জন্য
public static String getDataHolder() {
return dataHolder;
}
@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(new View.OnClickListener() {
@Override
public void onClick(View v) {
// ১. ইউজার ইনপুট নিয়ে স্ট্যাটিক ফিল্ডে রাখা
dataHolder = editText.getText().toString().trim();
// ২. সেকেন্ড অ্যাক্টিভিটি লঞ্চ করা
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(intent);
}
});
}
}
Step 4: activity_second.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:layout_margin="16dp"
android:orientation="vertical"
tools:context=".SecondActivity">
<TextView
android:id="@+id/text_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:textSize="20sp"
android:gravity="center" />
</LinearLayout>
Step 5: SecondActivity.java
package com.example.staticdatapass;
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 receivedData = MainActivity.getDataHolder();
textView.setText(receivedData != null ? receivedData : "ডেটা পাওয়া যায়নি");
}
}
Step 6: AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
package="com.example.staticdatapass">
<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=".MainActivity">
<intent-filter>
</intent-filter>
</activity>
<activity android:name=".SecondActivity" />
</application>
</manifest>
অ্যাপটি রান করা
- USB ডিবাগিং অন করে ডিভাইস কানেক্ট করুন বা এমুলেটর চালু করুন।
- টুলবার থেকে Run (▶) আইকনে ক্লিক করুন।
- ডিভাইস সিলেক্ট করুন।
- অ্যাপ খুললে প্রথম স্ক্রিনে টেক্সট লিখুন এবং Next বাটন চাপুন।
- দ্বিতীয় স্ক্রিনে আপনার লিখা টেক্সট দেখাবে।
রান টাইম স্ক্রিনশট (কনসেপ্টুয়াল)
স্ক্রিন ১: EditText এবং Button আছে।
স্ক্রিন ২: TextView-এ পাস করা টেক্সট দেখাচ্ছে।
বাস্তব ব্যবহারে এই পদ্ধতি এড়িয়ে যেতে হবে কেন?
🚫 প্রধান সমস্যা:
- যদি ইউজার হোম বাটন চাপে এবং সিস্টেম অ্যাপকে কিল করে, তখন
dataHolder=nullহয়ে যায়। - স্ক্রিন রোটেশনে MainActivity রিক্রিয়েট হলে স্ট্যাটিক ভেরিয়েবল থাকে (ক্লাস লোডার একই থাকায়), কিন্তু নতুন ইনস্ট্যান্সে পুরনো ডেটা দেখাতে পারে।
- মাল্টি-উইন্ডো বা ফোল্ডেবল ডিভাইসের ক্ষেত্রে অনপ্রেডিক্টেবল বিহেভিয়ার।
✅ সেরা বিকল্প: Intent.putExtra()
// MainActivity-এ
intent.putExtra("my_key", "my_value");
// SecondActivity-এ
String val = getIntent().getStringExtra("my_key");
এটি সিস্টেম-লেভেলে হ্যান্ডেল হয়, প্রসেস ডেথে সারভাইভ করে (SavedStateRegistry এর মাধ্যমে), এবং টাইপ-সেফ।
সারাংশ
স্ট্যাটিক মেথড দিয়ে ডেটা পাস করা শুধুমাত্র শিক্ষামূলক উদ্দেশ্যে গ্রহণযোগ্য। যেকোনো রিয়েল অ্যাপে Intent Extras / Bundle / ViewModel ব্যবহার করুন। এই টিউটোরিয়ালটি কনসেপ্ট বুঝতে সাহায্য করবে, কিন্তু প্রোডাকশন কোডে এটি কপি-পেস্ট করবেন না।