android - मैनिफेस्ट बनाम गतिविधि में ब्रॉडकास्ट रिसीवर रजिस्टर




android-intent broadcastreceiver (2)

मुझे यह समझने में कुछ मदद की ज़रूरत है कि जब मैं उम्मीद कर सकता हूं कि मेरा प्रसारण रिसीवर काम करेगा जब मैनिफेस्ट में पंजीकृत हो रहा है, तो चल रही गतिविधि या सेवा से पंजीकृत होना चाहिए।

तो उदाहरण के लिए यदि मैं निम्नलिखित इरादे फ़िल्टर के साथ एक स्टैंड अकेले रिसीवर पंजीकृत करता हूं तो यह सेवा / गतिविधि संदर्भ के बिना काम करता है:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.blk_burn.standalonereceiver"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="10" />
    <uses-permission android:name="android.permission.WAKE_LOCK"/>

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >

        <receiver android:name="TestReceiver">
            <intent-filter>
                <action android:name="android.media.AUDIO_BECOMING_NOISY"/>
            </intent-filter>
        </receiver>

    </application>

</manifest>

हालांकि अगर मैं android.media.AUDIO_BECOMING_NOISY साथ android.intent.action.HEADSET_PLUG को प्रतिस्थापित android.media.AUDIO_BECOMING_NOISY हूं तो रिसीवर ट्रिगर नहीं होता है ( एंड्रॉइड दस्तावेज़ीकरण )

इस साइट पर मुझे जो मिला उससे आपको इस रिसीवर को उस गतिविधि या सेवा से पंजीकृत करना होगा जो पहले से ही काम करने के लिए चल रहा है ( Post )।

  • क्या कोई मुझे बता सकता है कि यह मैनिफेस्ट में अपने इरादे फ़िल्टर को समायोजित करते समय क्यों काम नहीं करता है और आपको पृष्ठभूमि में एक सेवा चलाने की आवश्यकता क्यों है जो रिसीवर को संदर्भ / पंजीकृत करता है?

  • क्या कोई काम है ताकि मैं अपने ऐप के मैनिफेस्ट में android.intent.action.HEADSET_PLUG . android.intent.action.HEADSET_PLUG साथ एक इरादा फ़िल्टर का उपयोग कर अपने रिसीवर को पंजीकृत कर android.intent.action.HEADSET_PLUG ?

  • मैं कैसे पहचान सकता हूं कि एंड्रॉइड प्रलेखन से कौन सी ब्रॉडकास्ट कार्रवाइयों की सेवा या गतिविधि की आवश्यकता होती है, उन्हें केवल मैनिफेस्ट में सही फ़िल्टर बनाकर पंजीकृत किया जाता है?


यदि आपका रिसीवर मैनिफेस्ट में पंजीकृत है, और आपका ऐप नहीं चल रहा है, तो ब्रॉडकास्ट को संभालने के लिए एक नई प्रक्रिया बनाई जाएगी। यदि आप इसे कोड में पंजीकृत करते हैं, तो यह आपके द्वारा पंजीकृत गतिविधि / सेवा के जीवन से जुड़ा हुआ है। कुछ प्रसारणों के लिए, यदि यह अस्तित्व में नहीं है, तो यह वास्तव में एक नई ऐप प्रक्रिया बनाने के लिए समझ में नहीं आता है, या कुछ हैं सुरक्षा, प्रदर्शन, इत्यादि प्रभाव, और इस प्रकार आप केवल रिसीवर को कोड में पंजीकृत कर सकते हैं।

HEADSET_PLUG प्रसारण के लिए, ऐसा लगता है कि आपका विचार पहले से चल रहा ऐप यूआई, वॉल्यूम इत्यादि के लिए ऐप-विशिष्ट समायोजन करने के लिए प्राप्त कर सकता है। यदि आपका ऐप नहीं चल रहा है, तो आपको वास्तव में हेडफ़ोन अनप्लग होने की परवाह नहीं करनी चाहिए ।

AFAIK, इस जानकारी को सभी प्रसारणों के लिए संक्षेप में कोई भी स्थान नहीं दिया गया है, लेकिन प्रत्येक इरादे को जावाडॉक में पंजीकरण करने और उसका उपयोग करने के बारे में टिप्पणी करनी चाहिए, लेकिन स्पष्ट रूप से यह स्थानों में कमी है। यदि आप Intent.FLAG_RECEIVER_REGISTERED_ONLY लिए Android स्रोत पेड़ को grep करते हैं तो आपको एक सूची संकलित करने में सक्षम होना चाहिए।


हमेशा के रूप में प्रसारण रिसीवर मैनिफेस्ट फ़ाइलAndroidManifest.xml में कॉन्फ़िगर किया जा सकता है। एक ब्रॉडकास्ट रिसीवर जिसे इस तरह से कॉन्फ़िगर किया गया है उसे स्थिर रूप से पंजीकृत कहा जाता है।

तत्व का उपयोग कर आप अपने रिसीवर को मैनिफेस्ट फ़ाइल में पंजीकृत कर सकते हैं:

<receiver
   android:name=".ConnectivityChangeReceiver">
   <intent-filter>
      <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
   </intent-filter>
</receiver>

नेस्टेड तत्व का उपयोग उस घटना को निर्दिष्ट करने के लिए किया जाता है जब रिसीवर को प्रतिक्रिया देनी चाहिए।

डायनमिक ब्रॉडकास्ट रिसीवर

एक विकल्प के रूप में आप अपने कोड में अपने ब्रॉडकास्ट रिसीवर कार्यान्वयन को गतिशील रूप से पंजीकृत कर सकते हैं। आपको बस अपने संदर्भ ऑब्जेक्ट पर रजिस्टर रिसीवर () विधि को कॉल करने की आवश्यकता है।

रजिस्टर रिसीवर () विधि दो पैरामीटर लेता है:

रजिस्टर रिसीवर () विधि के तर्क

  • रिसीवर: ब्रॉडकास्ट रिसीवर जिसे आप रजिस्टर करना चाहते हैं
  • फ़िल्टर: IntentFilter ऑब्जेक्ट जो निर्दिष्ट करता है कि आपके रिसीवर को कौन सी घटना सुननी चाहिए।

जब आप अपने रिसीवर को इस तरह से पंजीकृत करते हैं, तब तक यह तब तक रहता है जब तक घटक रहता है और एंड्रॉइड इस रिसीवर को ईवेंट भेजता है जब तक कि निर्माण घटक स्वयं नष्ट न हो जाए।

जीवन चक्र को सही तरीके से संभालने का आपका काम है। इस प्रकार जब आप गतिशील रूप से एक रिसीवर जोड़ते हैं, तो उसी गतिविधि को अपनी गतिविधि के ऑनपॉज़ () विधि में अनधिकृत करने के लिए सावधानी बरतें!

मैं सलाह देता हूं कि रिसीवर को अपनी गतिविधि के ऑनस्यूम () विधि में पंजीकृत करें और इसे अपने ऑनपोज़ () विधि में अनधिकृत करने का सुझाव दें:

@Override
protected void onPause() {
   unregisterReceiver(mReceiver);
   super.onPause();
}

@Override
protected void onResume() {
   this.mReceiver = new ConnectivityChangeReceiver();
   registerReceiver(
         this.mReceiver, 
         new IntentFilter(
               ConnectivityManager.CONNECTIVITY_ACTION));
   super.onResume();
}

पंजीकरण करने के लिए कौन सी विधि का उपयोग करना है

अपने ब्रॉडकास्ट रिसीवर को पंजीकृत करने के लिए उपयोग करने के लिए कौन सी विधि इस बात पर निर्भर करती है कि आपका ऐप सिस्टम ईवेंट के साथ क्या करता है। मुझे लगता है कि मूल रूप से दो कारण हैं कि आपका ऐप सिस्टम-व्यापी घटनाओं के बारे में क्यों जानना चाहता है:

  • आपका ऐप इन घटनाओं के आसपास किसी तरह की सेवा प्रदान करता है
  • आपका ऐप राज्य परिवर्तनों के प्रति कृपापूर्वक प्रतिक्रिया करना चाहता है

पहली श्रेणी के उदाहरण ऐसे ऐप्स हैं जिन्हें डिवाइस बूट होने के तुरंत बाद काम करने की आवश्यकता होती है या जब भी ऐप इंस्टॉल किया जाता है तो उसे किसी प्रकार का काम शुरू करना चाहिए। बैटरी विजेट प्रो या ऐप 2 एसडी इन प्रकार के ऐप्स के लिए अच्छे उदाहरण हैं। इस प्रकार के लिए आपको Manifest फ़ाइल में ब्रॉडकास्ट रिसीवर पंजीकृत करना होगा।

दूसरी श्रेणी के उदाहरण ऐसे कार्यक्रम हैं जो आपके ऐप पर भरोसा कर सकते हैं परिस्थितियों में बदलाव को संकेत देते हैं। मान लें कि आपका ऐप एक स्थापित ब्लूटूथ कनेक्शन पर निर्भर करता है। आपको राज्य परिवर्तन पर प्रतिक्रिया देना है - लेकिन केवल तभी जब आपका ऐप सक्रिय हो। इस मामले में एक स्थिर रूप से पंजीकृत प्रसारण रिसीवर की कोई आवश्यकता नहीं है। एक गतिशील रूप से पंजीकृत एक और अधिक उचित होगा।

ऐसी कुछ घटनाएं भी हैं जिनके लिए आपको स्थिर रूप से पंजीकरण करने की अनुमति नहीं है। इसके लिए एक उदाहरण इरादा है। ACTION_TIME_TICK ईवेंट जो हर मिनट प्रसारित होता है। जो एक बुद्धिमान निर्णय है क्योंकि एक स्थिर रिसीवर अनावश्यक रूप से बैटरी को निकाल देगा।





intentfilter