এই টিউটোরিয়ালে আমরা শিখব অ্যান্ড্রয়েডে স্ট্যাটিক ভেরিয়েবল কী, কোথায় এবং কীভাবে ব্যবহার করা উচিত, এবং এর জীবনচক্র ও সতর্কতা।
প্রয়োজনীয় ধাপগুলো
ধাপ ১: নতুন প্রজেক্ট তৈরি করুন
Android Studio-তে File → New Project এ যান এবং প্রয়োজনীয় বিবরণ পূরণ করে একটি নতুন প্রজেক্ট তৈরি করুন।
ধাপ ২: লেআউট ফাইল তৈরি করুন
res/layout/activity_main.xml ফাইলে নিচের কোড যোগ করুন:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:app="https://schemas.android.com/apk/res-auto"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="MainActivity">
<TextView
android:id="@+id/Question"
android:layout_width="wrap_content"
android:layout_height="93dp"
android:padding="8dp"
android:text="I'm a Static Variable"
android:layout_marginTop="32sp"
android:layout_marginLeft="8dp"
android:textSize="32dp"
tools:layout_editor_absoluteY="8dp" />
</LinearLayout>
ধাপ ৩: মেইন এক্টিভিটিতে স্ট্যাটিক ভেরিয়েবল ব্যবহার করুন
src/MainActivity.java ফাইলে নিচের কোড যোগ করুন:
package app.com.sample;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends AppCompatActivity {
public static final String TAG = "I'm a Static Variable";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
protected void onStart() {
super.onStart();
Log.i(TAG, "onStart");
}
@Override
protected void onPause() {
super.onPause();
Log.i(TAG, "onPause");
}
@Override
protected void onStop() {
super.onStop();
Log.i(TAG, "onStop");
}
}
ধাপ ৪: ম্যানিফেস্ট কনফিগার করুন
AndroidManifest.xml ফাইল:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
package="app.com.sample">
<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>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
স্ট্যাটিক ভেরিয়েবল কী?
স্ট্যাটিক ভেরিয়েবল ক্লাস-লেভেলের ভেরিয়েবল যা অবজেক্ট (ইনস্ট্যান্স) এর ন होकर ক্লাসের সাথে সম্পর্কিত। সেটি ক্লাস লোড হলে মেমরিতে একবার অ্যালোকেট হয় এবং সমস্ত ইনস্ট্যান্স শেয়ার করে।
অ্যান্ড্রয়েডে স্ট্যাটিক ভেরিয়েবলের ব্যবহার ক্ষেত্র
✅ উপযোগী ব্যবহার:
- কনস্ট্যান্টস:
public static final String TAG = "MyApp";(লগিং-এর জন্য) - সিঙ্গলটন প্যাটার্ন: অ্যাপ্লিকেশন-ওয়াইড শেয়ার্ড ডেটা
- ইউটিলিটি মেথডস: হেল্পার ফাংশন যা স্টেট ধরে না
- ক্যাশ: কম্পিউটেশনালি ব্যয়বহুল ডেটা ক্যাশ করা
❌ এড়ানো উচিত:
- Context ধারণ করা:
static Context context;→ মেমরি লিক! - View ধারণ করা:
static TextView textView;→ মেমরি লিক! - অবজেক্ট যা লাইফসাইকেল আছে: Activity, Fragment, View, Drawable
- মিউটেবল শেয়ার্ড স্টেট: থ্রেড সেফটি সমস্যা তৈরি করে
মেমরি লিক উদাহরণ (ভুল পদ্ধতি)
// ❌ কখনো এটা করবেন না
public class MyActivity extends AppCompatActivity {
public static Context context; // মেমরি লিক!
public static TextView textView; // মেমরি লিক!
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
context = this; // এক্টিভিটি রেফারেন্স ধরে রাখে
textView = findViewById(R.id.textView);
}
}
সঠিক পদ্ধতি: Application ক্লাস বা সিঙ্গলটন
// Application ক্লাসে (সুপারিশ করা)
public class MyApp extends Application {
private static MyApp instance;
private String sharedData;
public static MyApp getInstance() { return instance; }
@Override
public void onCreate() {
super.onCreate();
instance = this;
}
public String getSharedData() { return sharedData; }
public void setSharedData(String data) { this.sharedData = data; }
}
// ম্যানিফেস্টে: android:name=".MyApp"
// যেকোনো জায়গা থেকে অ্যাক্সেস:
String data = MyApp.getInstance().getSharedData();
Static vs Instance ভেরিয়েবল
| দিক | Static | Instance |
|---|---|---|
| মেমরি | ক্লাস লোড হলে একবার | প্রতি অবজেক্টের জন্য আলাদা |
| অ্যাক্সেস | ClassName.variable | object.variable |
| লাইফসাইকেল | অ্যাপ চলাকালীন | অবজেক্টের সাথে জুমelsh |
| শেয়ারিং | সকল ইনস্ট্যান্স শেয়ার করে | প্রতিটি ইনস্ট্যান্সের আলাদা কপি |
সারাংশ
স্ট্যাটিক ভেরিয়েবল কনস্ট্যান্ট, ইউটিলিটি, সিঙ্গলটনের জন্য ব্যবহার করুন। Context, View, বা লাইফসাইকেলযুক্ত অবজেক্ট স্ট্যাটিক ফিল্ডে রাখবেন না। শেয়ার্ড ডেটার জন্য Application ক্লাস বা Dependency Injection (Hilt/Koin) ব্যবহার করুন।