LocalBroadcastManager का उपयोग कैसे करें?


452

Google डॉक्स और सर्विस ब्रॉडकास्ट डॉकLocalBroadcastManager में बताए अनुसार उपयोग / पता कैसे करें ?

मैंने इसे Google करने की कोशिश की, लेकिन शुरू करने के लिए कोई कोड उपलब्ध नहीं है?

दस्तावेज़ कहते हैं कि मुझे इसका उपयोग करना चाहिए अगर मैं अपने ऐप की प्रक्रिया में आंतरिक रूप से प्रसारण करना चाहता हूं, लेकिन मुझे नहीं पता कि इसके लिए कहां देखना है।

कोई मदद / टिप्पणी?

अपडेट : मुझे पता है कि ब्रॉडकास्ट का उपयोग कैसे करना है, लेकिन यह नहीं पता कि LocalBroadcastManagerमैं अपने प्रोजेक्ट में कैसे उपलब्ध होऊं।


वकास, क्या आपने रिसीवर को प्रकट में पंजीकृत किया है। यदि हाँ, तो कृपया मुझे बताएं कि कैसे?
मुदस्सिर

2
मुझे नहीं लगता कि आपको इस तरह के प्रसारण के लिए रिसीवर को पंजीकृत करने की आवश्यकता है, क्योंकि यदि आप करते हैं, तो वह रिसीवर वैश्विक प्रसारणों के लिए भी सुनेगा।
वाकासलाम

2
सच। फिर इसका मतलब है, मुझे इसे कोड में करना होगा जैसा कि नीचे दिए गए उत्तर में दिया गया है; LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver, new IntentFilter("custom-event-name"));
मुदस्सिर

2
LocalBroadcastManagerपदावनत कर दिया गया है। मैंने अपने को EventBus लाइब्रेरी के साथ बदल दिया, जो बहुत अच्छे, imo है।
क्रिश बी

जवाबों:


862

मैं वैसे भी इसका जवाब दूंगा। बस अगर किसी को इसकी जरूरत है।

ReceiverActivity.java

एक गतिविधि जो नामित घटना के लिए सूचनाओं के लिए देखता है "custom-event-name"

@Override
public void onCreate(Bundle savedInstanceState) {

  ...

  // Register to receive messages.
  // We are registering an observer (mMessageReceiver) to receive Intents
  // with actions named "custom-event-name".
  LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver,
      new IntentFilter("custom-event-name"));
}

// Our handler for received Intents. This will be called whenever an Intent
// with an action named "custom-event-name" is broadcasted.
private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
  @Override
  public void onReceive(Context context, Intent intent) {
    // Get extra data included in the Intent
    String message = intent.getStringExtra("message");
    Log.d("receiver", "Got message: " + message);
  }
};

@Override
protected void onDestroy() {
  // Unregister since the activity is about to be closed.
  LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver);
  super.onDestroy();
}

SenderActivity.java

दूसरी गतिविधि जो सूचनाएं भेजती / प्रसारित करती है।

@Override
public void onCreate(Bundle savedInstanceState) {

  ...

  // Every time a button is clicked, we want to broadcast a notification.
  findViewById(R.id.button_send).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
      sendMessage();
    }
  });
}

// Send an Intent with an action named "custom-event-name". The Intent sent should 
// be received by the ReceiverActivity.
private void sendMessage() {
  Log.d("sender", "Broadcasting message");
  Intent intent = new Intent("custom-event-name");
  // You can also include some extra data.
  intent.putExtra("message", "This is my message!");
  LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}

ऊपर दिए गए कोड के साथ, हर बार बटन R.id.button_sendक्लिक करने के बाद, एक इंटेंट प्रसारित होता है और इसके द्वारा प्राप्त होता mMessageReceiverहै ReceiverActivity

डीबग आउटपुट इस तरह दिखना चाहिए:

01-16 10:35:42.413: D/sender(356): Broadcasting message
01-16 10:35:42.421: D/receiver(356): Got message: This is my message! 

7
धन्यवाद। यह पहले से ही काम कर रहा है। लेकिन समस्या मैं सामना करना पड़ा था LocalBroadcastManager वर्ग पर पकड़ पाने के लिए। चूंकि यह एक सपोर्ट पैकेज क्लास है, इसलिए मैंने इसे एंड्रॉइड टूल्स से कम्पैटिबिलिटी लाइब्रेरी में जोड़ने तक अपने साधारण पैकेज में इसका उपयोग करने में सक्षम नहीं था। इसके जुड़ जाने के बाद सब ठीक हो गया। वैसे भी, जवाब के लिए धन्यवाद
वकसलाम

195
कृपया ध्यान दें कि onDestroy()बुलाया जाने की गारंटी नहीं है !!! आपको उपयोग करना होगा onPause()(क्योंकि केवल onPause()गारंटी है) और onResume()(क्योंकि यह मैच है onPause())
18446744073709551615

5
दोस्तों, ध्यान दें कि Google डॉक्स अब onPause के बाद की गतिविधि के बारे में क्या कहता है (): Killable = Pre-HONEYCOMB हनीकॉम्ब से शुरू होकर, कोई एप्लिकेशन तब तक हत्या की स्थिति में नहीं है जब तक कि उसका onStop () वापस नहीं आ जाता।
18446744073709551615

59
onDestroy()कोई समस्या नहीं है। जिस मामले में इसे नहीं बुलाया जाता है वह तब होता है जब ऐप को मार दिया जाता है, और इससे कोई फर्क नहीं पड़ता कि आप उस मामले में अपंजीकृत नहीं हैं क्योंकि पंजीकृत रिसीवरों की सूची भी नहीं बची है।
zapl

4
@ सेल्विन मुझे आशा है कि आप जानते हैं कि आप प्रसारण गतिविधि को प्राप्त गतिविधि को कमजोर रूप से संदर्भित कर सकते हैं और अनाथ होने पर खुद को अपंजीकृत कर सकते हैं। जब तक आप रैम में अपनी गतिविधि को बनाए रखने के लिए अपने ब्रॉडकास्टर का उपयोग नहीं करते हैं, तब तक आपको ऑनपॉज में इसे अपंजीकृत करने की जरूरत नहीं है। आपका उदाहरण एक आंतरिक वर्ग के साथ एक बुरा व्यवहार दिखाता है, यह बाहरी वर्ग को लीक करता है, यह ब्रॉडकास्टरेसर के लिए अद्वितीय नहीं है और कुछ प्रोग्रामर हैं जिन्हें हमेशा से बचाव करना होता है। GUI को संशोधित करने के लिए, जब आप गतिविधि फिर से शुरू की जाती है, तो आप एक स्थिति संग्रहीत कर सकते हैं, आपको GUI को संशोधित करने की आवश्यकता नहीं है।
जोहानशोघन

133

मैं इसके बजाय बड़े पैमाने पर जवाब देना चाहता हूं।

  1. LocalbroadcastManager Android 3.0 और इसके बाद के संस्करण में शामिल है ताकि आपको शुरुआती रिलीज़ के लिए समर्थन लाइब्रेरी v4 का उपयोग करना पड़े। यहाँ निर्देश देखें

  2. एक प्रसारण रिसीवर बनाएँ:

    private BroadcastReceiver onNotice= new BroadcastReceiver() {
    
        @Override
        public void onReceive(Context context, Intent intent) {
            // intent can contain anydata
            Log.d("sohail","onReceive called");
            tv.setText("Broadcast received !");
    
        }
    };
  3. गतिविधि के onResume में अपना रिसीवर पंजीकृत करें जैसे:

    protected void onResume() {
            super.onResume();
    
            IntentFilter iff= new IntentFilter(MyIntentService.ACTION);
            LocalBroadcastManager.getInstance(this).registerReceiver(onNotice, iff);
        }
    
    //MyIntentService.ACTION is just a public static string defined in MyIntentService.
  4. ऑन-प्रेज में अपंजीकृत रिसीवर:

    protected void onPause() {
      super.onPause();
      LocalBroadcastManager.getInstance(this).unregisterReceiver(onNotice);
    }
  5. अब जब भी अनुप्रयोगों की गतिविधि या सेवा से एक स्थानीयबोडकास्ट भेजा जाता है, तो OnNotice के onReceive को :) कहा जाएगा।

संपादित करें: आप पूरा ट्यूटोरियल यहां पढ़ सकते हैं LocalBroadcastManager: इंट्रा एप्लिकेशन संदेश पासिंग


15
+1। अगर आपका ब्रॉडकास्टर रिसीवर एक टुकड़े में है, तो इसका उपयोग करके LocalBroadcastManager.getInstance(getActivity()).registerReceiver(onNotice);पंजीकरण करें और इसका उपयोग न करेंLocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(onNotice);
पेटीएच

3
क्या आप सुनिश्चित हैं कि LocalBroadcastManager Android 3.0 और ऊपर में शामिल है? नहीं समर्थन lib छोड़कर कहीं इसे पा सकते हैं
mente

5
अजीब बात है, एलबीएम केवल समर्थन पुस्तकालय में शामिल है।
जेफरी ब्लटमैन

1
सुपर.ऑनपॉज () अंतिम स्टेटमेंट होना चाहिए जब ऑनपॉज विधि को ओवरराइट करें। अनपेक्षित बग से बचने के लिए सुपर.ऑनपॉज से पहले अपंजीकृत करें
थुप्टेन

2
मेरा मानना ​​है कि आप अपने जीवनचक्र को स्थानांतरित करना चाह सकते हैं onStopक्योंकि एंड्रॉइड एपीआई 24+ में "मल्टी-विंडो / स्प्लिट-व्यू" (एपीआई 26+ affaicr पर डिफ़ॉल्ट रूप से सक्षम) के साथ, जिस गतिविधि के साथ बातचीत नहीं की जा रही है वह रुकी हुई स्थिति में है। स्रोत: developer.android.com/guide/topics/ui/…
मार्टिन मार्कोसिनी

45

प्राप्त होने पर:

  • सबसे पहले रजिस्टर LocalBroadcast रिसीवर
  • फिर onReceive में आने वाले आशय डेटा को संभालें।

      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
    
          LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(this);
          lbm.registerReceiver(receiver, new IntentFilter("filter_string"));
      }
    
      public BroadcastReceiver receiver = new BroadcastReceiver() {
          @Override
          public void onReceive(Context context, Intent intent) {
              if (intent != null) {
                  String str = intent.getStringExtra("key");
                  // get all your data from intent and do what you want 
              }
          }
      };

अंत भेजने पर:

   Intent intent = new Intent("filter_string");
   intent.putExtra("key", "My Data");
   // put your all data using put extra 

   LocalBroadcastManager.getInstance(this).sendBroadcast(intent);

मेरे मामले में केवल तभी जब मैंने प्रसारण कार्यों को भेजते समय इरादे से कार्रवाई की है अन्यथा onReive () विधि कभी नहीं कहा जाता है ...
आकाश बिसरिया

27

ग्रहण में, अंततः मुझे अपनी परियोजना पर राइट-क्लिक करके और चयन करके संगतता / सहायता पुस्तकालय जोड़ना पड़ा :

Android Tools -> Add Support Library

एक बार जब यह जोड़ा गया था, तब मैं LocalBroadcastManagerअपने कोड में कक्षा का उपयोग करने में सक्षम था ।


Android संगतता लाइब्रेरी


13

लोकलब्रोडकास्नेगर को पदावनत किया जाता है, इसके बजाय वेधनीय पैटर्न के कार्यान्वयन का उपयोग करें।

androidx.localbroadcastmanager 1.1.0 संस्करण में पदावनत किया जा रहा है

कारण

LocalBroadcastManagerएक एप्लिकेशन-वाइड ईवेंट बस है और आपके ऐप में परत उल्लंघन का सामना करता है; कोई भी घटक किसी अन्य घटक से घटनाओं को सुन सकता है। यह सिस्टम ब्रॉडकास्टमैन के अनावश्यक उपयोग के मामले की सीमाओं को विरासत में मिला है; डेवलपर्स को इंटेंट का उपयोग करना पड़ता है, भले ही ऑब्जेक्ट केवल एक प्रक्रिया में रहते हैं और इसे कभी नहीं छोड़ते हैं। इसी कारण से, यह फीचर-वार प्रसारण प्रबंधक का पालन नहीं करता है।

ये एक भ्रमित करने वाले डेवलपर अनुभव को जोड़ते हैं।

प्रतिस्थापन

आप LocalBroadcastManagerअवलोकन पैटर्न के अन्य कार्यान्वयन के उपयोग को प्रतिस्थापित कर सकते हैं । आपके उपयोग के मामले के आधार पर, उपयुक्त विकल्प LiveDataया प्रतिक्रियाशील धाराएं हो सकती हैं।

LiveData का लाभ

आप LiveDataसिस्टम सेवाओं को लपेटने के लिए सिंगलटन पैटर्न का उपयोग करके किसी ऑब्जेक्ट का विस्तार कर सकते हैं ताकि उन्हें आपके ऐप में साझा किया जा सके। LiveDataसिस्टम सेवा एक बार, और फिर किसी भी पर्यवेक्षक कि संसाधन की जरूरत है तो बस देख सकते हैं करने के लिए वस्तु जोड़ता LiveDataवस्तु।

 public class MyFragment extends Fragment {
    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        LiveData<BigDecimal> myPriceListener = ...;
        myPriceListener.observe(this, price -> {
            // Update the UI.
        });
    }
}

observe()विधि टुकड़ा है, जो का एक उदाहरण है गुजरता LifecycleOwnerपहले तर्क के रूप में,। ऐसा करने से पता चलता है कि यह पर्यवेक्षक Lifecycleस्वामी से जुड़ी वस्तु से बंधा हुआ है, जिसका अर्थ है:

  • यदि जीवनचक्र वस्तु सक्रिय अवस्था में नहीं है, तो मान को बदलने पर भी पर्यवेक्षक को नहीं बुलाया जाता है।

  • जीवनचक्र वस्तु नष्ट होने के बाद, पर्यवेक्षक स्वतः हटा दिया जाता है

तथ्य यह है कि LiveDataऑब्जेक्ट जीवनचक्र-जागरूक हैं, इसका मतलब है कि आप उन्हें कई गतिविधियों, टुकड़ों और सेवाओं के बीच साझा कर सकते हैं।


1
आप पूरी दुनिया के संदर्भों को लीक करने के बारे में सही हैं, लेकिन मैं यह जानना चाहूंगा कि जब मैं किसी गतिविधि के बिना चल रही अग्रभूमि सेवा से संवाद करना चाहता हूं, तो क्या एक उपयुक्त प्रतिस्थापन होगा, लेकिन जब गतिविधि आती है, तो उन्हें संवाद करने की आवश्यकता होती है?
1919 ateebahmed

2
LiveData ऑब्जेक्ट के साथ एक सिंगलटन क्लास बनाएं और सेवा से अपना डेटा पोस्ट करें। एक बार गतिविधि शुरू होने के बाद, गतिविधि बिना किसी नुकसान के आसानी से लाइवडेटा का निरीक्षण कर सकती है। उदाहरण: MyServiceData.getInstance ()। getMyData () देखें ...
दारिश

3
मुझे लोकलब्रॉडकास्टमैन याद आएगा। यदि यह Google पर डेवलपर्स को भ्रमित कर रहा था, तो शायद उन्हें ओवर-इंजीनियरिंग चीजों को रोकने की आवश्यकता है?
AFD

@Darish क्या यह सिंगलटन क्लास एप्लीकेशन ऑब्जेक्ट में इसे स्टोर करने के बराबर होगा? इन मामलों में इस तरह की वैश्विक स्थिति को बुरा व्यवहार क्यों नहीं माना जाता है?
xuiqzy

12

अपने वैश्विक प्रसारण को लोकलब्रॉडकास्ट में कैसे बदलें

1) इंस्टेंस बनाएं

LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);

2) ब्रॉडकास्टसीवर को पंजीकृत करने के लिए

बदलने के

registerReceiver(new YourReceiver(),new IntentFilter("YourAction"));

साथ में

localBroadcastManager.registerReceiver(new YourReceiver(),new IntentFilter("YourAction"));

3) प्रसारण संदेश भेजने के लिए

बदलने के

sendBroadcast(intent);

साथ में

localBroadcastManager.sendBroadcast(intent);

4) अपंजीकृत प्रसारण संदेश के लिए

बदलने के

unregisterReceiver(mybroadcast);

साथ में

localBroadcastManager.unregisterReceiver(mybroadcast);

मैं कैसे कई IntentFilter रजिस्टर कर सकते हैं ??
परिक्षित चालके

@ParikshitChalke: लिंक
XMAN

6

जब आप LocalBroadcastReceiver के साथ पर्याप्त खेलेंगे, तो मैं आपको ग्रीन रोबोट के EventBus को देने का सुझाव दूंगा - आप निश्चित रूप से LBR की तुलना में इसके अंतर और उपयोगिता का एहसास करेंगे। कम कोड, रिसीवर के थ्रेड (यूआई / बीजी) के बारे में अनुकूलन, रिसीवर की उपलब्धता की जांच, चिपचिपी घटनाओं, डेटा डेटा आदि के लिए घटनाओं का उपयोग किया जा सकता है।


2

एक गतिविधि का एक उदाहरण और एक LocalBroadcastManager को लागू करने वाली सेवा डेवलपर डॉक्स में पाई जा सकती है । मैंने व्यक्तिगत रूप से इसे बहुत उपयोगी पाया।

EDIT: लिंक तब से साइट से हटा दिया गया है, लेकिन डेटा निम्न है: https://github.com/carrot-garden/android_maven-android-plugin-samples/blob/master//44demos/src/com/ उदाहरण / एंड्रॉयड / supportv4 / सामग्री / LocalServiceBroadcaster.java



0

अपने AndroidManifest.xml फ़ाइल में एक को टैग के साथ घोषित करके (जिसे स्थैतिक भी कहा जाता है)

<receiver android:name=".YourBrodcastReceiverClass"  android:exported="true">
<intent-filter>
    <!-- The actions you wish to listen to, below is an example -->
    <action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>

आप देखेंगे कि ऊपर घोषित प्रसारण रिसीवर के पास एक्सपोर्ट = "सच" की संपत्ति है। यह विशेषता रिसीवर को बताती है कि वह एप्लिकेशन के दायरे के बाहर से प्रसारण प्राप्त कर सकता है।
2. या गतिशील रूप से रजिस्टरराइवर के साथ एक उदाहरण दर्ज करके (जिसे संदर्भ पंजीकृत के रूप में जाना जाता है)

public abstract Intent registerReceiver (BroadcastReceiver receiver, 
            IntentFilter filter);

public void onReceive(Context context, Intent intent) {
//Implement your logic here
}

प्रसारण भेजने के तीन तरीके हैं:
SendOrderedBroadcast विधि, एक समय में केवल एक रिसीवर को प्रसारण भेजना सुनिश्चित करती है। प्रत्येक प्रसारण बदले में, इसके बाद डेटा को पास कर सकता है, या प्रसारण के प्रसार को रोक सकता है, इसके बाद प्राप्तियों को।
SendBroadcast उपरोक्त विधि के समान है, जिसमें एक अंतर है। सभी प्रसारण रिसीवर संदेश प्राप्त करते हैं और एक दूसरे पर निर्भर नहीं होते हैं।
LocalBroadcastManager.sendBroadcast विधि केवल आपके आवेदन के अंदर परिभाषित रिसीवर को प्रसारण भेजती है और आपके आवेदन के दायरे से अधिक नहीं होती है।


-4

हम ब्रॉडकास्टर के लिए भी इंटरफ़ेस का उपयोग कर सकते हैं यहां मैं ब्रॉडकास्टमैन के लिए टेस्ट कोड साझा कर रहा हूं लेकिन इंटरफ़ेस द्वारा।

पहले एक इंटरफ़ेस बनाएं जैसे:

public interface MyInterface {
     void GetName(String name);
}

2-यह पहला वर्ग है जिसे कार्यान्वयन की आवश्यकता है

public class First implements MyInterface{

    MyInterface interfc;    
    public static void main(String[] args) {
      First f=new First();      
      Second s=new Second();
      f.initIterface(s);
      f.GetName("Paddy");
  }
  private void initIterface(MyInterface interfc){
    this.interfc=interfc;
  }
  public void GetName(String name) {
    System.out.println("first "+name);
    interfc.GetName(name);  
  }
}

3-यहां दूसरी श्रेणी है जो उसी इंटरफ़ेस को लागू करती है जिसका तरीका स्वचालित रूप से कॉल करता है

public class Second implements MyInterface{
   public void GetName(String name) {
     System.out.println("Second"+name);
   }
}

इसलिए इस दृष्टिकोण से हम प्रसारण प्रबंधक के समान ही इंटरफ़ेस का उपयोग कर सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.