कई फिल्टर या कई प्रसारण के साथ BroadcastReceiver?


115

मेरे पास एक एंड्रॉइड गतिविधि है जिसे दो अलग-अलग प्रसारणों को पकड़ने की आवश्यकता है। मेरा वर्तमान दृष्टिकोण 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गतिविधि के राज्य के आधार पर प्रसारण को पकड़े जाने पर कार्रवाई को सक्षम या अक्षम करने के लिए एक ध्वज का उपयोग करता हूं ।

सवाल यह है कि क्या यह सही तरीका है?

या, इस तरह दो अलग-अलग ब्रॉडकास्टर्स का होना बेहतर होगा:

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

और किसका प्रदर्शन बेहतर है?

जवाबों:


210

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

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

IntentFilter filterRefresh = new IntentFilter(Params.INTENT_REFRESH);

रिफ्रेश और अपडेट के लिए फ़िल्टर करें

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

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


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

2
@gonzobrains हां, कई इरादों के लिए आपको समान संख्या में उपयोग करने की आवश्यकता होती है, जैसे कि उन्हें छानने के लिए बयान
वाकासलाम

@Aqas क्या यह गतिशील रूप से ऐसा करने का एक तरीका है ताकि आपके पास एक सामान्य प्रसारण रिसीवर हो और इसमें कई हैंडलर जोड़े जा सकें, ताकि जब आप इसमें नया इरादा जोड़ते हैं तो हर बार बुनियादी ढांचे को संशोधित न करना पड़े?
गोंजोब्रैन्स

क्या आप वास्तव में "यह गतिशील रूप से करने के लिए" से मतलब है ? बस अपने इरादे-फिल्टर के अंदर सभी एक्शन स्ट्रिंग्स को शामिल करें और अपने आवश्यक एक्शन स्ट्रिंग्स की पहचान करने के लिए और भी कुछ करें।
वाकासलाम

3
मैं इस जवाब के लिए सभी upvotes नहीं समझता। ऑप क्या करने की कोशिश कर रहा था, इसके लिए ऐसा लगता है कि 2 कार्यों के साथ 1 आशय फ़िल्टर पर्याप्त है। प्रश्न में पहले कोड ब्लॉक में कोड लगता है कि सभी की जरूरत है।
hBrent

28

हर क्रिया के लिए, 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();
        }
    }

}

4
क्या मुझे registerReceiverकई बार कॉल करने और unregisterReceiverकेवल एक बार कॉल करने की चिंता नहीं होनी चाहिए ?
mr5

3
यदि यू कई बार रजिस्टर करता है तो कई बार और अनरजिस्टायर को केवल एक बार अनरजिस्टर्ड करें जब रिसीवर का पिछला उदाहरण लीक हो सकता है। तो उदाहरण यू रजिस्टर के बाद unregister के लिए उस उदाहरण का उपयोग कर।
पवन यादव

2
यदि आप एक ही कार्रवाई पर कई बार पंजीकरण करना चाहते हैं, तो मैं कहूंगा कि आपको चिंतित होना चाहिए।
स्टडआउट

1
क्या यह हतोत्साहित नहीं होना चाहिए? जब आप एक से अधिक ब्रॉडकास्टसीवर को एक से अधिक बार रजिस्टर करते हैं, तो Google देवों के लिए एक अपवाद फेंकना उपयोगी होगा। इसके बजाय हमें इरादे फ़िल्टर में कई क्रियाएं जोड़ना चाहिए।
TheRealChx101
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.