Giới thiệu
Bài viết giải thích khái niệm biến static trong Java/Android, nơi khai báo và ví dụ dùng làm TAG log chung cho cả lớp.
Các bước thực hiện
Bước 1: Tạo dự án mới
Khởi tạo project Android Studio.
Bước 2: Giao diện đơn giản (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="Tôi là biến Static"
android:layout_marginTop="32sp"
android:layout_marginLeft="8dp"
android:textSize="32dp"
tools:layout_editor_absoluteY="8dp" />
</LinearLayout>
Bước 3: Sử dụng static variable (src/MainActivity.java)
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends AppCompatActivity {
// Biến static: thuộc về CLASS, không phải instance
// Chỉ có 1 bản sao cho tất cả instance của MainActivity
public static final String TAG = "Tôi là biến Static";
@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");
}
}
Bước 4: 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>
Chạy ứng dụng
Kết nối thiết bị, nhấn Run. Mở Logcat lọc tag "Tôi là biến Static". Các vòng đời onStart, onPause, onStop sẽ log cùng một TAG static.

Hiểu về static trong Java/Android
Đặc điểm
- Thuộc về Class, không phải Instance (object)
- Chỉ có 1 bản sao trong bộ nhớ, chia sẻ cho tất cả instance
- Truy cập qua
ClassName.staticFieldhoặcinstance.staticField(khuyên dùng ClassName) - Khởi tạo khi class được load (lần đầu truy cập)
Ứng dụng phổ biến trong Android
1. Constant (Hằng số)
public static final String PREFS_NAME = "MyAppPrefs"; public static final int REQUEST_CODE_CAMERA = 100; public static final String TAG = "MyAppTag"; // Log tag
2. Singleton Pattern
public class MyManager {
private static MyManager instance;
public static MyManager getInstance() {
if (instance == null) instance = new MyManager();
return instance;
}
}
3. Utility Methods
public class Utils {
public static String formatDate(Date date) { ... }
public static int dpToPx(Context context, int dp) { ... }
}
4. Shared Data giữa các Instance
public class MyActivity extends AppCompatActivity {
static int globalCounter = 0; // Đếm số lần Activity được tạo
@Override protected void onCreate() { globalCounter++; }
}
⚠️ CẢNH BÁO: Memory Leak với static Context/View
// KHÔNG BAO GIỜ LÀM ĐIỀU NÀY: public static Context context; // Leak toàn bộ Activity! public static TextView textView; // Leak View + Activity! public static Drawable drawable; // Leak Drawable + Context! // ĐÚNG: Chỉ giữ primitive, String, hoặc WeakReference public static String configValue; public static WeakReference<Context> weakContext;
Best Practices
- Dùng
static finalcho constants (UPPER_SNAKE_CASE) - Tránh static mutable state (biến static không final) - khó test, không thread-safe
- Không bao giờ giữ reference đến Context, View, Activity, Fragment trong static field
- Dùng
WeakReferencenếu buộc phải giữ Context tạm thời - Cân nhắc Dependency Injection (Hilt/Koin) thay vì Singleton static