LocalBroadcastManager - ऐप-आंतरिक इवेंट बस
नोट: LocalBroadcastManager **डिप्रिकेट** है (AndroidX 1.1.0+ से)। आधुनिक ऐप्स को **LiveData/Flow**, **RxJava**, या **इवेंट बस लाइब्रेरी (greenrobot EventBus, Kotlin Channel/Flow)** का उपयोग करना चाहिए। यह लेख लीगेसी API को दस्तावेज करता है और माइग्रेशन पथ दिखाता है।
लीगेसी उपयोग (संदर्भ के लिए)
// पंजीकरण (उदाहरण: onStart/onResume में)
LocalBroadcastManager.getInstance(context)
.registerReceiver(receiver, new IntentFilter("my-custom-action"));
// भेजना
Intent intent = new Intent("my-custom-action");
intent.putExtra("key", "value");
LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
// अनपंजीकरण (onStop/onPause में)
LocalBroadcastManager.getInstance(context).unregisterReceiver(receiver);
आधुनिक प्रतिस्थापन: LiveData (सिंगलटन इवेंट बस)
public class EventBus {
private static final EventBus INSTANCE = new EventBus();
private final MutableLiveData bus = new MutableLiveData<>();
private EventBus() {}
public static EventBus get() { return INSTANCE; }
public void post(Event event) { bus.postValue(event); }
public LiveData observe() { return bus; }
public static class Event {
public final String action;
public final Bundle data;
public Event(String action, Bundle data) { this.action = action; this.data = data; }
}
}
उपयोग
// प्रेषक
EventBus.get().post(new EventBus.Event("user-login", bundleOf("uid" to userId)));
// प्राप्तकर्ता (फ्रैगमेंट/गतिविधि/व्यू मॉडल में)
EventBus.get().observe().observe(viewLifecycleOwner, event -> {
if ("user-login".equals(event.action)) {
String uid = event.data.getString("uid");
// संभालें
}
});
आधुनिक प्रतिस्थापन: Kotlin Channel / Flow (कोरआउटिन)
// साझा चैनल (सिंगलटन या DI के माध्यम से) val eventChannel = Channel(Channel.UNLIMITED) // प्रेषक (कोरआउटिन में) eventChannel.send(Event("data-loaded", bundleOf("items" to list))) // प्राप्तकर्ता (लॉन्च कोरआउटिन) scope.launch { for (event in eventChannel) { when (event.action) { "data-loaded" -> updateUI(event.data) } } }
तुलना
| पहलू | LocalBroadcastManager | LiveData EventBus | Channel/Flow |
|---|---|---|---|
| थ्रेड सुरक्षा | हां | हां (मुख्य थ्रेड पोस्ट) | हां |
| जीवनचक्र-जागरूक | नहीं (मैन्युअल पंजीकरण) | हां (observe लाइफसाइकिल) | मैन्युअल स्कोप |
| स्टिकी इवेंट्स | नहीं | हां (postValue अंतिम मान रखता है) | नहीं (रीप्ले के लिए SharedFlow का उपयोग करें) |
| प्रकार सुरक्षा | नहीं (स्ट्रिंग एक्शन) | हां (सील्ड क्लास/डेटा क्लास) | हां |
| परीक्षण | कठिन | आसान (LiveData मॉक करें) | आसान (टेस्ट स्कोप) |
माइग्रेशन चेकलिस्ट
- सभी
LocalBroadcastManagerउपयोगों की पहचान करें। - इवेंट प्रकार परिभाषित करें (सील्ड क्लास या डेटा क्लास)।
- LiveData-आधारित EventBus (सरल) या Channel/Flow (कोरआउटिन-हेवी ऐप्स) चुनें।
- प्रेषकों/प्राप्तकर्ताओं को रीफैक्टर करें।
- लीगेसी निर्भरता (
androidx.localbroadcastmanager:localbroadcastmanager) हटाएं।
मूल उदाहरण की समीक्षा
मूल कोड एक गतिविधि में LocalBroadcastManager को पंजीकृत करता था, एक क्लिक पर प्रसारित करता था, और एक ही गतिविधि में प्राप्त करता था — एक राउंड-ट्रिप जो एक साधारण विधि कॉल या LiveData के साथ बेहतर होती है। यह पैटर्न वास्तविक डिकॉउपलिंग (घटक सीमाओं के पार) के लिए उपयोगी है, लेकिन आधुनिक विकल्पों को प्राथमिकता दी जाती है।