android क्यों Context.registerReceiver के बजाय स्थानीय बोडकास्ट प्रबंधक काम नहीं करेगा?




service broadcastreceiver (3)

मैंने कभी भी स्थानीय प्रसार मैनेजर का इस्तेमाल नहीं किया है, लेकिन ऐसा लगता है कि आपको अपने रिसीवर को वहां पंजीकृत करना होगा (यानी lbm.registerReceiver(...) रिसीवर lbm.registerReceiver(...) , mycontext.registerReceiver(...) )। क्या आप ऐसा कर रहे हैं?

अब मैं एक और सवाल पर आया हूं, क्या किसी सेवा का ऐसा प्रसंग नहीं होना चाहिए जो इसे कहते हैं? इस आलेख से एक मुख्य थ्रेड पर सेवा चलती है, इसलिए मुझे लगता था कि संदर्भ एक ही होगा

प्रसंग वर्ग थ्रेड्स से संबंधित नहीं है। वास्तव में, दोनों सेवा और गतिविधि (अप्रत्यक्ष) प्रसंग के उपवर्ग हैं - इसलिए वे स्वयं के संदर्भ हैं!
यही कारण है कि आप "यह" एक संदर्भ के रूप में उपयोग कर सकते हैं।

लेकिन जो भी प्रसंग आपको LocalBroadcastManager.getInstance() में भेजते हैं, आप को उसी एलबीएम आवृत्ति को प्राप्त करना चाहिए। मैं किसी भी कारण से नहीं सो सकता है कि आप नहीं करेंगे - सिवाय इसके कि क्या आप अलग-अलग प्रक्रियाओं में गतिविधि और सेवा चला रहे हैं?

मुझे इस ऐप के लिए एक फीचर लागू करना पड़ा जिसमें एक Activity और पृष्ठभूमि पर काम कर रहे एक Service शामिल है (यह Service कार्यान्वित करती है, IntentService Service नहीं)

मैं इंटरनेट पर कुछ ट्यूटोरियल्स चला गया जो कि काम करना चाहिए, और वे सभी LocalBroadcastManager उपयोग LocalBroadcastManager , जो वैसे ही एंड्रॉइड द्वारा अनुशंसित है:

यदि आपको एप्लिकेशन में प्रसारित करने की आवश्यकता नहीं है, तो नीचे वर्णित अधिक सामान्य सुविधाओं के बजाय LocalBroadcastManager साथ इस कक्षा का उपयोग करने पर विचार करें।

मैं वाकई समस्या का पता लगाने के लिए एक दिन खो गया क्योंकि यह मेरे लिए काम नहीं करेगा: यह केवल काम करता है अगर मैं Context.sendBroadcast() उपयोग करता हूं। और LocalBroadcastManager विधियों के बजाय LocalBroadcastManager Context.registerReceiver()

अब मेरा ऐप काम कर रहा है, लेकिन मुझे लगता है कि मैं सर्वोत्तम अभ्यासों के खिलाफ जा रहा हूं, और मुझे नहीं पता कि क्यों कोई भी विचार क्यों हो रहा है?

संपादित करें:

मैंने इस प्रश्न के लिखे जाने के बाद मैं समस्या पर आगे चला गया। LocalBroadcastManager एक सिंगलटन के माध्यम से काम करता है, जैसा कि हमें LocalBroadcastManager.getInstance(this).method() को कॉल करना चाहिए। मैंने दोनों उदाहरणों ( Activity और Service ) में लॉग इन किया है और उनके पास अलग-अलग मेमोरी पते हैं I अब मैं एक और सवाल पर आया हूं, क्या किसी Service का ऐसा Context नहीं होना चाहिए जो इसे कहते हैं? इस आलेख से एक मुख्य थ्रेड पर सेवा चलती है, इसलिए मुझे लगता था कि Context एक ही होगा

उस पर कोई विचार? (लंबी पोस्ट के लिए क्षमा करें)

कोड नमूने:

MyService

public class MyService extends Service {

...

// When an event is triggered, sends a broadcast

Intent myIntent = new Intent(MainActivity.MY_INTENT);
myIntent.putExtra("myMsg","msg");
sendBroadcast(myIntent);

// Previously I was trying:
// LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(myIntent);

}

MyActivity

public class MainActivity {

...

private BroadcastReceiver messageReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent 
            Log.d("onReceive", "received!");
            // TODO something
        }
    };

@Override
protected void onResume() {
    super.onResume();
    registerReceiver(messageReceiver, new IntentFilter(MY_INTENT));
    // Previously I was trying:
    // LocalBroadcastManager.getInstance(getApplicationContext()).registerReceiver(messageReceiver, new IntentFilter(MY_INTENT));
}
}

घोषणा:

private BroadcastReceiver receiver;

प्रारंभ:

receiver = new BroadcastReceiver()
{
    @Override
    public void onReceive(Context context, Intent intent)
    {
        //todo
    }
};

पंजीकरण:

LocalBroadcastManager.getInstance(context).registerReceiver(receiver, new IntentFilter("RECEIVER_FILTER"));

context किसी भी प्रकार का context हो सकता है, आप एप्लिकेशन संदर्भ का उपयोग कर सकते हैं।

अपंजीकृत:

LocalBroadcastManager.getInstance(context).unregisterReceiver(receiver);

प्रसारण:

Intent intent = new Intent("RECEIVER_FILTER");
intent.putExtra("EXTRA", someExtra);
LocalBroadcastManager.getInstance(context).sendBroadcast(intent);

देखें कि आपकी सेवा और गतिविधि अलग-अलग प्रक्रिया में चल रही है, तो स्थानीय प्रबन्धक को अलग-अलग प्रक्रिया में लागू नहीं किया जा सकता है। (आपको इसे एंड्रॉइड मैनिफ़ेस्ट.एक्सएम फ़ाइल में देखना चाहिए)







intentservice