Khi cần truyền dữ liệu tạm thời giữa các Activity (không cần lưu trữ bền vững), hai cách tiếp cận cơ bản nhất là: biến static và Intent. Bài viết so sánh hai phương pháp này với ví dụ hoàn chỉnh.
Phương pháp 1: Biến static (Chỉ cho mục đích học tập/demo nhanh)
Bước 1-2: Project và Layout (Giống các ví dụ trước)
Tạo project Empty Activity, layout có EditText + Button.
Bước 3: MainActivity.java với biến static
package com.example.myapplication;
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 tempValue; // Biến static giữ dữ liệu
public static String getTempValue() {
return tempValue;
}
@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 -> {
tempValue = editText.getText().toString().trim();
startActivity(new Intent(this, SecondActivity.class));
});
}
}
Bước 4-5: SecondActivity.java đọc static
package com.example.myapplication;
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("Static: " + MainActivity.getTempValue());
}
}
Phương pháp 2: Intent (Chuẩn, an toàn, khuyến nghị)
Bước 3 (Intent): MainActivity.java
package com.example.myapplication;
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_DATA = "extra_data";
@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 value = editText.getText().toString().trim();
Intent intent = new Intent(this, SecondActivity.class);
intent.putExtra(EXTRA_DATA, value);
startActivity(intent);
});
}
}
Bước 5 (Intent): SecondActivity.java
package com.example.myapplication;
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 value = getIntent().getStringExtra(MainActivity.EXTRA_DATA);
textView.setText("Intent: " + (value != null ? value : "rỗng"));
}
}
So sánh chi tiết
| Tiêu chí | Biến Static | Intent / Bundle |
|---|---|---|
| Độ tin cậy | Thấp (mất khi process die) | Cao (hệ thống quản lý) |
| Bảo mật | Public static - truy cập bất kỳ đâu | Chỉ Activity đích nhận được |
| Hỗ trợ kiểu dữ liệu | Mọi object Java | Primitive, String, Parcelable, Serializable |
| Vòng đời | Theo ClassLoader | Gắn liền với Intent delivery |
| Testability | Khó (global state) | Dễ (dependency injection) |
| Thread safety | Không an toàn | An toàn (main thread) |
Khi nào dùng Static?
- Demo/prototype cực nhanh.
- Dữ liệu singleton toàn cục (config, cache nhẹ) - nhưng nên dùng Dependency Injection (Hilt/Koin) hoặc Application class.
- Truyền object lớn, không Parcelable được (tạm thời) - nhưng tốt hơn dùng ViewModel/Repository.
Best Practice hiện đại: ViewModel + LiveData/Flow
Kiến trúc MVVM (Jetpack) giải quyết triệt để vấn đề truyền dữ liệu và giữ trạng thái khi rotate screen:
// SharedViewModel.java
class SharedViewModel : ViewModel() {
private val _data = MutableLiveData<String>()
val data: LiveData<String> = _data
fun setData(value: String) { _data.value = value }
}
// MainActivity
viewModel.setData(editText.text.toString())
startActivity(Intent(this, SecondActivity::class.java))
// SecondActivity
viewModel.data.observe(this) { textView.text = it }
Kết luận
Luôn dùng Intent + Bundle cho truyền dữ liệu giữa Activity. Tránh static trừ khi hiểu rõ rủi ro. Đối với app thực tế, hãy áp dụng ViewModel để chia sẻ dữ liệu an toàn, bền vững qua các thay đổi cấu hình.