2015-06-11 6 views
5

यही है, मेरे पास ब्रॉडकास्ट रिसीवर है जो मैं एक ब्रॉडस्टास्ट सुनने के लिए फ्लाई पर बना हूं, जिसके बाद मैं इसे खुद को अपंजीकृत करना चाहता हूं।क्या रिसीवर की अपनी ऑनसाइट() विधि से 'गतिशील' ब्रॉडकास्ट रिसीवर को अपंजीकृत करना ठीक है?

मुझे ऐसा कोई नमूना कोड नहीं मिला है जो इस तरह से करता है, लेकिन न ही मुझे एंड्रॉइड ऑनलाइन दस्तावेज़ों में कोई नियम मिला है जो इसे रोकता है। लेकिन मैं गतिविधि के लिए इसे चारों ओर लटका नहीं दे सकता, और यह किसी भी अज्ञात वर्ग में है, इसलिए युक्त वर्ग को चर नाम भी नहीं पता है।

है, कोड इस तरह दिखता है:

myInfoReceiver = new BroadcastReceiver() { 
onReceive(Context ctx, Intent intt) { 
    // do some Notification when I get here 
    nm.notify("I got here") // obvious pseudo code 
    ctx.unregisterReceiver(myInfoReceiver); 
} // end onReceive 
ctx.registerReceiver),uInfoReceiver, new IntentFilter(...)); 
}; // end BroadcastReceiver 

लेकिन जब मैं इस चलाने के लिए, एंड्रॉयड शिकायत जब यह अपंजीकृत कहता है, यह कहा गया कि रिसीवर वहाँ (मैं सटीक शब्द भूल पंजीकरण रद्द करना नहीं है, लेकिन यह IllegalArgumentException फेंक दिया)।

मैंने यह भी जांचने के लिए कोड को संशोधित करने का प्रयास किया कि 'इंट' में कार्रवाई अपेक्षित है - लेकिन फिर भी यह अभी भी निष्पादित है लेकिन चुपचाप अपंजीकृत करने में विफल रहता है।

+0

क्या लक्ष्य आप करते हैं हासिल करना चाहते हैं? मुझे लगता है, 'ब्रॉडकास्ट रिसीवर' आपकी समस्या के लिए गलत विकल्प हो सकता है। यदि आप एक बार कुछ ऑपरेशन करना चाहते हैं और आप इसे गतिविधि जीवन चक्र से स्वतंत्र बनाना चाहते हैं, तो ईवेंट बस (उदा। ओटो) के साथ 'इरादा सेवा' या 'सेवा' का उपयोग करने पर विचार करें। –

+0

मैंने इराद सेवा आदि का उपयोग नहीं किया होगा क्योंकि बड़ी प्रणाली का यह हिस्सा पहले से ही एक प्रसारण उद्देश्य है जो मुझे इच्छित जानकारी का प्रतिनिधित्व करता है। इसके अलावा, मुझे जीवन चक्र से इतनी स्वतंत्रता की आवश्यकता नहीं है। मैं पहले से ही यूआई थ्रेड पर इस इरादे की प्रतीक्षा कर रहा हूं, कुछ भी नहीं कर रहा हूं लेकिन एक प्रगति संवाद दिखा रहा हूं। –

उत्तर

5

आपके प्रश्न का उत्तर "हाँ" है। हालांकि ...

... आपको पर उसी Context पर कॉल करने की आवश्यकता है जिसे आपने registerReceiver() पर कॉल किया था। आपके द्वारा पोस्ट किए गए कोड में Context पर onReceive() पर तर्क के रूप में आप unregisterReceiver() पर कॉल कर रहे हैं। यह वही Context नहीं है, यही कारण है कि आपको अपवाद मिल रहा है।

+0

में लगातार है, मुझे कुछ समय के लिए संदर्भ का संदेह है। निश्चितता की जांच के लिए धन्यवाद। –

+0

मुझे अभी इस समस्या का सामना करना पड़ रहा है। क्या कोई अच्छा काम है? – user2892437

0

मैं बस हाँ कहूंगा, कोई समस्या नहीं है।

उदाहरण के लिए मैं इसे एक बार स्थान तय करने के लिए उपयोग करता हूं, और बिना किसी समस्या को देखे अन्य लॉजिक में भी इसका उपयोग किया जा सकता है।

प्लस मैंने इसे कई बार देखा है।

+0

मैंने सोचा होगा कि "कोई समस्या नहीं है" भी। लेकिन मुझे IllegalArgumentException मिलता है। कोई विचार क्यों? यह अभी भी अपने स्वयं के रिसीव() विधि में पंजीकृत नहीं हो सकता है? –

+0

क्या आप रिसीवर को अनधिकृत करते समय सही रिसीवर ऑब्जेक्ट पास कर रहे हैं क्योंकि मैं आपके द्वारा प्रकाशित – 7383

+0

पर दिए गए उपरोक्त कोड में एक मेल नहीं देख सकता है, आपको इसे केवल 'संदर्भ' पर कॉल करने की आवश्यकता है। उदाहरण के लिए 'गतिविधि' के लिए 'MyActivity.this' जैसी कुछ चीज़ों का उपयोग करें। अन्यथा, कृपया stacktrace पोस्ट करें। – shkschneider

0

मैं विभिन्न समाधान, अंत में मैं इसे इस तरह से कर रहा हूँ की कोशिश की है:

पंजीयन:

MyApplication.getInstance().getApplicationContext().registerReceiver(sentReceiver, new IntentFilter(SENT)); 

SentReceiver:

public class SentReceiver extends BroadcastReceiver { 
    public void onReceive(Context context, Intent arg1) { 
     switch (getResultCode()) { 
      case Activity.RESULT_OK: 
       Toast.makeText(context, 
         context.getString(R.string.sms_envoye), Toast.LENGTH_SHORT) 
         .show(); 
       break; 
      case SmsManager.RESULT_ERROR_GENERIC_FAILURE: 
       Toast.makeText(context, 
         context.getString(R.string.sms_defaillance_generique), 
         Toast.LENGTH_SHORT).show(); 
       break; 
      case SmsManager.RESULT_ERROR_NO_SERVICE: 
       Toast.makeText(context, 
         context.getString(R.string.sms_pas_de_service), 
         Toast.LENGTH_SHORT).show(); 
       break; 
      case SmsManager.RESULT_ERROR_NULL_PDU: 
       Toast.makeText(context, 
         context.getString(R.string.sms_pas_de_pdu), 
         Toast.LENGTH_SHORT).show(); 
       break; 
      case SmsManager.RESULT_ERROR_RADIO_OFF: 
       Toast.makeText(context, 
         context.getString(R.string.sms_radio_desactivee), 
         Toast.LENGTH_SHORT).show(); 
       break; 
     } 
     MyApplication.getInstance().getApplicationContext().unregisterReceiver(this); 
    } 
MyApplication साथ

:

public class MyApplication extends Application { 
    private static MyApplication mInstance; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     mInstance = this; 
    } 

    public static synchronized MyApplication getInstance() { 
     return mInstance; 
    }   
} 
संबंधित मुद्दे