Trong ứng dụng Android, việc trao đổi dữ liệu giữa
Activity, Fragment và Service thường gặp nhiều trở ngại do giới hạn về phạm vi sống (lifecycle) và mô hình phân tách trách nhiệm. Các cách tiếp cận truyền thống như broadcast receiver hay Handler/Looper đòi hỏi cấu hình thủ công, dễ gây rò rỉ bộ nhớ và làm tăng độ phức tạp của mã nguồn.
Một giải pháp thay thế hiệu quả là áp dụng mô hình *event bus* — một cơ chế đăng ký–phát hành (publish-subscribe), trong đó các thành phần không cần biết đến nhau trực tiếp. Thay vì gọi phương thức trực tiếp hoặc truyền Intent qua hệ thống, người gửi chỉ cần đẩy một sự kiện vào bus; các thành phần đã đăng ký lắng nghe sự kiện đó sẽ được thông báo tự động.
Dưới đây là cách triển khai một hệ thống event bus đơn giản nhưng đầy đủ chức năng, sử dụng thư viện SimpleEventBus:
- Nhập thư viện và khai báo phụ thuộc
Thêm tệpsimple_eventbus.jarvào thư mụclibs/, sau đó khai báo trongbuild.gradle(nếu dùng Gradle):
Đồng thời import hai lớp cốt lõi tại nơi cần sử dụng:implementation files('libs/simple_eventbus.jar')import org.simple.eventbus.EventBus; import org.simple.eventbus.Subscriber; - Đăng ký và hủy đăng ký vòng đời
Trong cảMainScreenActivity(người nhận) vàSecondaryActivity(người phát), đảm bảo đăng ký với bus khi bắt đầu và hủy khi kết thúc:
Việc này ngăn chặn lỗi truy cập đối tượng đã bị huỷ và đảm bảo tính an toàn luồng.@Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); EventBus.getDefault().register(this); } @Override protected void onDestroy() { EventBus.getDefault().unregister(this); super.onDestroy(); } - Gửi sự kiện từ Activity thứ hai
TrongSecondaryActivity, gắn sự kiện click cho nút:
Lưu ý: Đối tượngfindViewById(R.id.action_trigger).setOnClickListener(v -> { counter++; statusView.setText("Lần nhấn thứ: " + counter); EventBus.getDefault().post(new ClickEvent(counter), "user_interaction"); });ClickEventlà một lớp dữ liệu thuần (POJO) chứa thông tin hữu ích — khác với ví dụ gốc dùngObject()rỗng — giúp mở rộng khả năng truyền dữ liệu trong tương lai. - Xử lý sự kiện tại Activity chính
Khai báo phương thức xử lý trongMainScreenActivityvới chú thích@Subscriber:
Phương thức này sẽ được gọi tự động mỗi khi có sự kiện mang tag@Subscriber(tag = "user_interaction") public void onUserActionReceived(ClickEvent event) { displayCount.setText("Tổng số lần nhấn từ màn hình khác: " + event.getCount()); Log.d("EventBusDemo", "Nhận sự kiện với giá trị: " + event.getCount()); }"user_interaction"được đăng tải — không cần gọi thủ công hay kiểm tra điều kiện. - Kết quả thực thi
Khi người dùng chuyển sangSecondaryActivity, nhấn nút nhiều lần, rồi quay lạiMainScreenActivity, giao diện sẽ phản ánh đúng số lần tương tác đã được đồng bộ hoá qua bus — minh hoạ rõ ràng cơ chế liên lạc phi đồng bộ, không ràng buộc chặt chẽ giữa các thành phần.