2012-02-03 13 views
79

मेरे पास एक एंड्रॉइड गतिविधि है जिसे दो अलग-अलग प्रसारणों को पकड़ने की आवश्यकता है। मेरे वर्तमान दृष्टिकोण गतिविधि के भीतर एक भी BroadcastReceiver है और इसके साथ दोनों प्रसारण को पकड़ने के लिए है:ब्रॉडकास्ट रिसीवर एकाधिक फ़िल्टर या एकाधिक ब्रॉडकास्ट रिसीवर के साथ?

public class MyActivity extends Activity { 
    private MyActivity.BroadcastListener mBroadcastListener; 
    private boolean mIsActivityPaused = false; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.mylayout); 

     // Create the broadcast listener and register the filters 
     mIsActivityPaused = false; 
     mBroadcastListener = new BroadcastListener(); 

     IntentFilter filter = new IntentFilter(); 
     filter.addAction(Params.INTENT_REFRESH); 
     filter.addAction(Params.INTENT_UPDATE); 
     registerReceiver(mBroadcastListener, filter); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     mIsActivityPaused = false; 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     mIsActivityPaused = true; 
    } 

    @Override 
    protected void onDestroy() { 
     unregisterReceiver(mBroadcastListener); 
     super.onDestroy(); 
    } 

    private void refresh() { 
     // refresh 
    } 

    private void update() { 
     // update 
    } 

    private class BroadcastListener extends BroadcastReceiver { 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      if (intent.getAction().equals(Params.INTENT_REFRESH && !mIsActivityPaused)) { 
       refresh(); 
      } else if (intent.getAction().equals(Params.INTENT_UPDATE)) { 
       update(); 
      } 
     } 
    } 
} 

मैं refresh() निष्पादित करने के लिए केवल तभी मेरे गतिविधि स्क्रीन पर दिखाई देता है चाहता हूँ, लेकिन मैं INTENT_UPDATE पकड़ने और निष्पादित करने के लिए चाहते हैं गतिविधि के पूरे जीवनकाल के दौरान update(), इस पर ध्यान दिए बिना कि गतिविधि दिखाई दे रही है या नहीं।

मैं केवल दो फिल्टर है कि मैं onCreate में रजिस्टर में से एक का पंजीकरण रद्द करना किसी भी तरह से नहीं मिला, तो मैं एक ध्वज का उपयोग सक्षम या कार्रवाई अक्षम करें, जब INTENT_REFRESH प्रसारण पकड़ा है निष्पादित करने के लिए राज्य पर निर्भर करता करने के लिए गतिविधि का।

प्रश्न है: क्या यह सही दृष्टिकोण है?

या, यह बेहतर हो इस प्रकार दो अलग-अलग BroadcastReceivers के लिए होगा:

public class MyActivity extends Activity { 
    private MyActivity.BroadcastListenerRefresh mBroadcastListenerRefresh; 
    private MyActivity.BroadcastListenerUpdate mBroadcastListenerUpdate; 
    private boolean mIsBroadcastListenerRefreshRegistered = false; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     // Create the broadcast listeners 
     mBroadcastListenerRefresh = new BroadcastListenerRefresh(); 
     mBroadcastListenerUpdate = new BroadcastListenerUpdate(); 

     registerReceiver(mBroadcastListenerRefresh, new IntentFilter(Params.INTENT_REFRESH)); 
     registerReceiver(mBroadcastListenerUpdate, new IntentFilter(Params.INTENT_UPDATE)); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     if (mBroadcastListenerRefresh != null && !mIsBroadcastListenerRefreshRegistered) { 
      registerReceiver(mBroadcastListenerRefresh, new IntentFilter(Params.INTENT_REFRESH)); 
      mIsBroadcastListenerRefreshRegistered = true; 
     } 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     if (mBroadcastListenerRefresh != null && mIsBroadcastListenerRefreshRegistered) { 
      unregisterReceiver(mBroadcastListenerRefresh); 
      mIsBroadcastListenerRefreshRegistered = false; 
     } 
    } 

    @Override 
    protected void onDestroy() { 
     unregisterReceiver(mBroadcastListenerRefresh); 
     unregisterReceiver(mBroadcastListenerUpdate); 
     super.onDestroy(); 
    } 

    private void refresh() { 
     // refresh 
    } 

    private void update() { 
     // update 
    } 

    private class BroadcastListenerRefresh extends BroadcastReceiver { 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      if (intent.getAction().equals(Params.INTENT_REFRESH)) { 
       refresh(); 
      } 
     } 
    } 

    private class BroadcastListenerUpdate extends BroadcastReceiver { 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      if (intent.getAction().equals(Params.INTENT_UPDATE)) { 
       update(); 
      } 
     } 
    } 
} 

और जो एक बेहतर प्रदर्शन है?

उत्तर

153

बजाय, आप दो अलग-अलग आशय फिल्टर प्रदान कर सकता है:

ताज़ा के लिए फिल्टर केवल

IntentFilter filterRefresh = new IntentFilter(Params.INTENT_REFRESH); 

ताज़ा के लिए फिल्टर और अद्यतन

IntentFilter filterRefreshUpdate = new IntentFilter(); 
filterRefreshUpdate.addAction(Params.INTENT_REFRESH); 
filterRefreshUpdate.addAction(Params.INTENT_UPDATE); 

अब आप पंजीकरण से आशय फिल्टर के बीच स्विच कर सकते हैं और वांछित एक को पंजीकृत नहीं कर रहा है लेकिन आपके रिसीवर का कार्यान्वयन समान होगा

+0

धन्यवाद, यह एक बेहतर समाधान है और यह काम करता है। –

+0

@Waqas क्या आप ब्रॉडकास्ट रिसीवर का एक उदाहरण कार्यान्वयन प्रदान कर सकते हैं जो कई उद्देश्यों को प्राप्त करेगा? क्या यह सिर्फ एक बड़ा अगर-और-कथन है? – gonzobrains

+2

@gonzobrains हाँ, कई उद्देश्यों के लिए आपको – waqaslam

23

प्रत्येक कार्रवाई के लिए, IntentFilter बनाएं और इसे पंजीकृत करें।

@Override 
protected void onResume() { 

    super.onResume(); 

    BroadcastListener receiver = new BroadcastListener(); 

    // Register the filter for listening broadcast. 
    IntentFilter filterRefresh = new IntentFilter(Params.INTENT_REFRESH); 
    IntentFilter filterUpdate = new IntentFilter(Params.INTENT_UPDATE); 

    registerReceiver(receiver, filterRefresh); 
    registerReceiver(receiver, filterUpdate); 
} 



private class BroadcastListener extends BroadcastReceiver { 
    public void onReceive(Context ctx, Intent intent) { 

     if (intent.getAction().equals(Params.INTENT_UPDATE)) { 
      update(); 
     } else if(intent.getAction().equals(Params.INTENT_REFRESH)) { 
      refresh(); 
     } 
    } 

} 
+1

क्या मुझे 'रजिस्टर रिसीवर' को कई बार कॉल करने और 'अनियंत्रित रिसीवर' को केवल एक बार आमंत्रित करने से चिंतित नहीं होना चाहिए? – mr5

+2

यदि आप रजिस्टर रिसीवर को कई बार कॉल करते हैं और अनियंत्रित केवल एक बार प्राप्त करते हैं तो रिसीवर का पिछला उदाहरण रिसाव हो सकता है। तो उदाहरण के बाद आप उस उदाहरण का उपयोग अपंजीकृत के लिए करते हैं। –

+1

यदि आप एक ही कार्रवाई पर कई बार पंजीकरण करना चाहते थे, तो मैं कहूंगा कि आपको चिंतित होना चाहिए। – zgulser

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