Giới thiệu
Lưu ý quan trọng: LocalBroadcastManager đã bị deprecated từ AndroidX 1.0 (2019). Google khuyến nghị thay thế bằng LiveData, Flow, RxJava, hoặc EventBus (greenrobot). Bài viết này giải thích cách cũ để bảo trì code legacy.
Cách cũ - LocalBroadcastManager (Deprecated)
1. Dependency (build.gradle)
dependencies {
implementation "androidx.localbroadcastmanager:localbroadcastmanager:1.0.0"
}
2. Gửi Broadcast (Producer)
// Trong Activity/Fragment/Service
Intent intent = new Intent("MY_CUSTOM_ACTION");
intent.putExtra("key", "Giá trị từ LocalBroadcast");
LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
3. Nhận Broadcast (Consumer)
// Trong Activity/Fragment
private BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String value = intent.getStringExtra("key");
// Cập nhật UI
}
};
@Override
protected void onStart() {
super.onStart();
LocalBroadcastManager.getInstance(this).registerReceiver(receiver,
new IntentFilter("MY_CUSTOM_ACTION"));
}
@Override
protected void onStop() {
super.onStop();
LocalBroadcastManager.getInstance(this).unregisterReceiver(receiver);
}
4. Ví dụ hoàn chỉnh (MainActivity.java)
package com.example.myapplication;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
TextView tvResult;
private BroadcastReceiver localReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String msg = intent.getStringExtra("name");
tvResult.setText("Nhận local broadcast: " + msg);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvResult = findViewById(R.id.tvResult);
tvResult.setText("Nhấn nút để gửi broadcast");
// Đăng ký nhận
LocalBroadcastManager.getInstance(this).registerReceiver(localReceiver,
new IntentFilter("custom-action-local-broadcast"));
findViewById(R.id.btnSend).setOnClickListener(v -> {
Intent intent = new Intent("custom-action-local-broadcast");
intent.putExtra("name", "Tutorialspoint.com");
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
});
}
@Override
protected void onDestroy() {
super.onDestroy();
LocalBroadcastManager.getInstance(this).unregisterReceiver(localReceiver);
}
}
Cách hiện đại - Thay thế LocalBroadcastManager
1. LiveData + ViewModel (Khuyên dùng cho Architecture Components)
// SharedViewModel.java
public class SharedViewModel extends ViewModel {
private MutableLiveData<String> message = new MutableLiveData<>();
public void send(String msg) { message.setValue(msg); }
public LiveData<String> getMessage() { return message; }
}
// Fragment/Activity gửi
viewModel.send("Hello from Fragment A");
// Fragment/Activity nhận
viewModel.getMessage().observe(getViewLifecycleOwner(), msg -> {
// Cập nhật UI
});
2. Kotlin Flow / StateFlow (Coroutines)
// SharedViewModel.kt
class SharedViewModel : ViewModel() {
private val _message = MutableStateFlow<String?>(null)
val message: StateFlow<String?> = _message
fun send(msg: String) { _message.value = msg }
}
// Collect trong Fragment
viewLifecycleOwner.lifecycleScope.launch {
viewModel.message.collect { msg ->
// Cập nhật UI
}
}
3. EventBus (greenrobot) - Đơn giản, mạnh mẽ
// Event class
public class MessageEvent { public final String msg; public MessageEvent(String m){msg=m;} }
// Gửi
EventBus.getDefault().post(new MessageEvent("Hello"));
// Nhận (trong Activity/Fragment)
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessage(MessageEvent event) { /* update UI */ }
@Override onStart() { EventBus.getDefault().register(this); }
@Override onStop() { EventBus.getDefault().unregister(this); }
So sánh
| Giải pháp | Ưu điểm | Nhược điểm |
|---|---|---|
| LocalBroadcastManager | Đơn giản, hệ thống | Deprecated, string-based, không type-safe |
| LiveData/ViewModel | Lifecycle-aware, type-safe, testable | Cần ViewModel, hơi verbose |
| Kotlin Flow | Reactive, coroutines, cold/hot stream | Cần Kotlin, học curve |
| EventBus | Decoupled, annotation-based, sticky events | Thư viện thứ 3, global bus |
Chạy ví dụ cũ
Nhấn Run → nhấn nút "Gửi" → TextView cập nhật "Nhận local broadcast: Tutorialspoint.com".

