2012-06-04 13 views
54

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

<?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.intent.action.HEADSET_PLUG साथ android.media.AUDIO_BECOMING_NOISY की जगह रिसीवर ट्रिगर नहीं है:

इसलिए उदाहरण के लिए अगर मैं एक अकेले खड़े रिसीवर निम्नलिखित लक्ष्य फ़िल्टर यह यह करने के लिए एक सेवा/गतिविधि संदर्भ बिना काम करता है के साथ रजिस्टर (Android Documentation)

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

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

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

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

उत्तर

78

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

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

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

+1

इरादा। फ्लैग .. और इसे स्रोत कोड में ढूंढना समझ में आता है। धन्यवाद –

+1

पहले पैराग्राफ के लिए .. हट ऑफ :) –

+1

क्या आपके पास अपने कथन का समर्थन करने के लिए कोई आधिकारिक दस्तावेज़ है (** यदि आप रिसीवर मैनिफेस्ट में पंजीकृत हैं और आपका ऐप नहीं चल रहा है, तो एक नई प्रक्रिया को संभालने के लिए बनाया जाएगा प्रसारण।**)? –

8

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

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

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

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

Dyanmic प्रसारण रिसीवर

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

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

registerReceiver() विधि के तर्कों

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

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

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

जो विधि रजिस्टर करने के लिए

@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(); 
} 

जब उपयोग करने के लिए:

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

  • आपके ऐप ने इन घटनाओं
  • आपका एप्लिकेशन कृपा प्रतिक्रिया करने के लिए राज्य में परिवर्तन करने के लिए
चाहता है चारों ओर सेवा के कुछ प्रकार प्रदान करता है पहली श्रेणी
के लिए

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

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

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

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