2011-02-10 9 views
21

मेरे पास एक बार उपयोग के लिए BroadcastReceiver है।ऑनसीस में एंड्रॉइड ब्रॉडकास्ट रिसीवर को अनधिकृत करना "रिसीवर पंजीकृत नहीं है"

मैं इसे एक गतिविधि में पंजीकृत कर रहा हूं। मैं unregisterReceiver() में नहीं डाल सकता क्योंकि गतिविधि को रोका या नष्ट होने पर भी इसे चलना पड़ता है।

मैं, BroadcastReceiver खुद का पंजीकरण रद्द करना जब यह किया जाता है चाहता हूँ कुछ इस तरह:

public class SmsReceiver extends BroadcastReceiver { 

    public void onReceive(Context context, Intent intent) { 
      // do some code.. 
      context.unregisterReceiver(this) 
     } 
} 

लेकिन यह एक अपवाद का कारण बनता है: Receiver not registered.

उत्तर

24

BroadcastReceiver केवल onReceive() विधि के निष्पादन के दौरान मौजूद है। तो, यह प्रसारित/प्राप्त होने पर हर बार एक फेंकने वाले उदाहरण का मूल्यांकन करता है। Broadcast Receiver Lifecycle देखें। BroadcastReceiver एस की गतिशील रूप से पंजीकरण/पंजीकरण रद्द करने के लिए, आपको onPause() में onResume() के दौरान फिर से पंजीकृत करने के लिए अपने रिसीवर का उदाहरण याद रखना होगा।

+0

एक ब्रॉडकास्ट रिसीवर ऑब्जेक्ट एक ही कचरा संग्रह नियमों का पालन करता है जो किसी अन्य वस्तु के रूप में होता है। कोई विशेष "फेंकने वाला उदाहरण" नहीं है। 'On'eceive' में 'this' का संदर्भ देना उसी परिणाम को ऑब्जेक्ट बनाया गया था (इसे आज़माएं) से एक संदर्भ देता है। प्रलेखन रिसीवर की * प्रक्रिया * के बारे में बात कर रहा है * रिसीवर ऑब्जेक्ट के स्तर पर कुछ भी नहीं मारा जा रहा है। – blahdiblah

0

यदि आप किसी सेवा/गतिविधि से reciver पंजीकरण रद्द करने की कोशिश की है? हो सकता है कि अगर आप इसे रिसीवर से खुद को अपंजीकृत करने के लिए कहते हैं तो कुछ समस्या हो सकती है।

0

शायद आप इसे अपने प्रोग्राम में कहीं और अनियंत्रित कर चुके हैं, हालांकि यह संभवतः यह संभव नहीं है। शायद आपके context.unregisterReceiver से पहले, लेकिन onReceive विधि में आप एक क्रिया का आह्वान करते हैं, जिसके परिणामस्वरूप context.unregisterReceiver तक पहुंचने से पहले रिसीवर को अपरिवर्तित किया जाता है।

बस सुनिश्चित करें कि आप रिसीवर को यथासंभव कम से कम स्थानों से अपंजीकृत कर रहे हैं, अधिमानतः - बिल्कुल एक।

+2

है लेकिन अगर मैं यह पहले से ही अपंजीकृत, कैसे यह अभी भी करने के लिए हो जाता है वह बिंदु और अनियंत्रित विधि चलाता है? यह संभव नहीं है ... – shaimagz

0

शायद समस्या यह है कि आप रिसीवर के संदर्भ से रिसीवर को अनधिकृत करने का प्रयास कर रहे हैं, संदर्भ के बजाय जहां यह मूल रूप से पंजीकृत था।

3

बस जिस गतिविधि में आपने पंजीकृत किया है उसमें एक विधि कॉल जोड़ें, और में विधि, रिसीवर को अनधिकृत करें। इस तरह आप जानते हैं इसका काम किया गया है।

हालांकि, अगर गतिविधि रोक दी जाती है या नष्ट हो जाती है तो रिसीवर काम नहीं करेगा। आपको इसे मैनिफेस्ट में घोषित करना होगा या फिर इसे एक लंबे समय से चलने वाली सेवा में पंजीकृत करना होगा ताकि उसे गतिविधि के जीवनकाल के बाहर काम कर सकें। जहां तक ​​मुझे पता है, आप मैनिफेस्ट में घोषित एक रिसीवर को अपंजीकृत नहीं कर सकते हैं क्योंकि आपको इसके साथ पंजीकृत उदाहरण नहीं मिलता है। लेकिन सेवा को अनधिकृत करने के लिए विधि को कॉल करना चाहिए।

यदि आपको केवल एक बार उपयोग के लिए एक कर्मचारी की आवश्यकता है, तो आप जिस क्रिया को प्रसारित कर रहे हैं उसके साथ मैनिफेस्ट में एक निर्यातित इराद सेवा घोषित करें। वह इरादा सेवा शुरू की जाएगी जब इरादा प्राप्त हो जाएगा और जिस उद्देश्य से इसे शुरू किया गया है, और फिर जब यह अपना काम पूरा हो जाए, तो वह खुद ही बंद हो जाएगा।

10

मैं जानता हूँ कि इस सवाल का पहले से ही एक जवाब है लेकिन इस संहिता

इस कोड है कोशिश BatteryInfo के लिए। और यह काम किया।अटैच किया जा रहा StackOverFlow/Tutorial

+0

यह मेरे लिए काम नहीं करता है, यह कहता है कि यह पंजीकृत नहीं है। मुझे लगता है कि मूल mBatInfoReceiver उस समय तक अस्तित्व में नहीं है जब रिसीव को – hyena

2

मैं मिले हैं एक ही समस्या के लिए

private BroadcastReceiver mBatInfoReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context arg0, Intent intent) { 
     // TODO Auto-generated method stub 
     int level = intent.getIntExtra("level", 0); 
     Log.i("Battery", String.valueOf(level) + "%"); 
     arg0.unregisterReceiver(mBatInfoReceiver); 
    } 

}; 

//Below code is the Code which attaches the reciever put this code in which ever place you want. 

this.registerReceiver(this.mBatInfoReceiver, new IntentFilter(
       Intent.ACTION_BATTERY_CHANGED)); 

संदर्भ, वास्तव में, सही जवाब LocalBroadcastManager.getInstance(context).unregisterReceiver(this); नहीं बल्कि context.unregisterReceiver(this)

+0

कहा जाता है क्या आपको अपने उत्तर में कुछ याद आती है? "लेकिन यहां कोड दर्ज नहीं करें"। कृपया इसे –

+0

ठीक करें जो मेरे लिए काम नहीं करता है, मैंने एक और समाधान पोस्ट किया है [यहां] (http://stackoverflow.com/a/39748974/4221945) –

संबंधित मुद्दे