2011-10-25 13 views
16

मेरे पास एक गतिविधि में प्रोग्रामेटिक रूप से पंजीकृत प्रसारण रिसीवर है। यह PACKAGE_REMOVED मंशा का जवाब देता है, जो एक पैकेज हटा दिए जाने पर आग लगती है।ब्रॉडकास्ट्रेसीवर और रोके गए गतिविधि

समस्या यह है कि, यह संदेश नहीं मिला है। मुझे लगता है कि यह इस कारण है कि जब मैं गतिविधि छोड़ देता हूं और ऐप को अनइंस्टॉल करने के लिए दूसरी गतिविधि में जाता हूं, तो मूल गतिविधि रोक दी जाती है। क्या यह हो सकता है कि एक रोका गया गतिविधि (जहां रिसीवर में अनियंत्रित नहीं है) रिसीवर को भी रोक देता है?

उत्तर

36

जब आप किसी गतिविधि में प्रोग्रामिक रूप से प्रसारण प्राप्तकर्ता पंजीकृत करते हैं, तो गतिविधि को रोका जाने पर प्रसारण नहीं मिलेगा। BroadcastReceiver docs उतना स्पष्ट नहीं है जितना वे इस बिंदु पर हो सकते हैं। वे सिस्टम ओवरहेड को कम करने के लिए पूरी तरह से रोकें पर अनियंत्रित करने की सलाह देते हैं।

यदि आप अपनी गतिविधि अग्रभूमि में नहीं होने पर भी ईवेंट प्राप्त करना चाहते हैं, तो receiver तत्व का उपयोग करके रिसीवर को अपने मैनिफेस्ट में पंजीकृत करें।

+1

क्या यह पंजीकृत रिसीवर यदि वर्तमान में रोके गए गतिविधि के अंदर रहने वाले मैनिफेस्ट में पंजीकृत है, तो इसकी संलग्न गतिविधि के निजी चरों को प्राप्त करने में सक्षम हो सकता है? – Peterdk

+0

कोई बात नहीं, अब मैं देखता हूं कि एक रिसीवर क्लास एक इंटरफ़ेस नहीं है, लेकिन एक वर्ग जिसे आपको प्राप्त करने की आवश्यकता है। – Peterdk

+0

@chris, मुझे यह एंड्रॉइड दस्तावेज़ों में प्रलेखित नहीं दिखाई देता है। –

2

हो सकता है कि आप सेवा में रिसीवर जो चलेंगे पृष्ठभूमि

5

अपने प्रोजेक्ट में कोई Receiver जोड़े रजिस्टर कर सकते हैं और तुम भी अपने आवेदन शुरू करने के बिना इस घटना मिल जाएगा।

public class TestReciver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Log.d("TestReciver",intent.getAction()+"\n" 
       +intent.getDataString()+"\n" 
       +"UID: "+intent.getIntExtra(Intent.EXTRA_UID,0)+"\n" 
       +"DATA_REMOVED: "+intent.getBooleanExtra(Intent.EXTRA_DATA_REMOVED, false)+"\n" 
       +"REPLACING: "+intent.getBooleanExtra(Intent.EXTRA_REPLACING, false) 
      ); 
    } 

} 

और अपने मेनिफ़ेस्ट में इस तरह इसे जोड़ने (अपने < आवेदन > टैग के अंदर):

<receiver android:name="TestReciver" > 
    <intent-filter > 
     <action android:name="android.intent.action.PACKAGE_REMOVED" /> 
     <data android:scheme="package" /> 
    </intent-filter> 
</receiver> 

आप इस तरह एक रिसीवर का उपयोग करते हैं तो आप किसी भी रजिस्टर कॉल नहीं करते या तो अपंजीकृत यह हमेशा होगा डेटा प्राप्त करने के लिए तैयार रहें।

एक नोट यह है कि यदि आप उपयोगकर्ताओं को अपने ऐप को एसडी कार्ड में ले जाने देते हैं तो यह काम नहीं करेगा। यदि कोई ईवेंट भेजा जाता है जब एसडी कार्ड अनमाउंट किया जाता है तो रिसीवर पहुंच योग्य नहीं होगा और आप ईवेंट को याद करेंगे।

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