Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Android

Đâu là vị trí và cách dùng biến static trong Android Studio?

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.

Đâu là vị trí và cách dùng biến static trong Android Studio?

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.staticField hoặc instance.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 final cho 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 WeakReference nếu buộc phải giữ Context tạm thời
  • Cân nhắc Dependency Injection (Hilt/Koin) thay vì Singleton static