একাধিক ফিল্টার বা একাধিক ব্রডকাস্টআরসিভার সহ ব্রডকাস্টারসিভার?


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

এখন আপনি কাঙ্ক্ষিতটিকে নিবন্ধভুক্ত এবং নিবন্ধভুক্ত করে অভিপ্রায়কারী ফিল্টারগুলির মধ্যে স্যুইচ করতে পারেন তবে আপনার গ্রহণকারীর প্রয়োগ একই হবে


@ ওয়াকাস আপনি কি ব্রডকাস্টারসিভারের একটি উদাহরণ প্রয়োগ করতে পারেন যা একাধিক উদ্দেশ্য অর্জন করবে? এটি ঠিক কি যদি অন্যথায় বিবৃতি হয়?
গঞ্জোব্রাইনগুলি

2
@ অ্যাজোনজোব্রেইনস হ্যাঁ, একাধিক অভিপ্রায়গুলির জন্য আপনাকে ফিল্টার করার জন্য যদি সমান সংখ্যক বিবৃতি ব্যবহার করতে হয়
ওয়াকসলাম

@ ওয়াকাস এটিকে গতিশীল করার কোনও উপায় আছে যাতে আপনার জেনেরিক ব্রডকাস্ট রিসিভার থাকে এবং এতে একাধিক হ্যান্ডলার যুক্ত করতে পারেন যাতে প্রতিবার আপনি যখন কোনও নতুন অভিপ্রায় যুক্ত করেন তখন বেসিক কাঠামোটি সংশোধন করতে না হয়?
gonzobrains

"এই গতিশীল করতে" দ্বারা আপনি ঠিক কী বোঝাতে চান ? কেবলমাত্র আপনার উদ্দেশ্য-ফিল্টারগুলির মধ্যে সমস্ত ক্রিয়া স্ট্রিং অন্তর্ভুক্ত করুন এবং যদি আপনার প্রয়োজনীয় ক্রিয়াকলাপের স্ট্রিংগুলি সনাক্ত করতে অন্যথায় সঞ্চালন করুন।
ওয়াকসলাম

3
আমি এই উত্তরের জন্য সমস্ত upvotes বুঝতে পারি না। ওপি যা করার চেষ্টা করছিল তার জন্য, দেখে মনে হচ্ছে যে 2 টি ক্রিয়া সহ 1 অভিপ্রায় ফিল্টার যথেষ্ট is প্রশ্নের প্রথম কোড ব্লকের কোডটি মনে হচ্ছে যে এটি প্রয়োজনীয়।
hBrent

28

প্রতিটি ক্রিয়াকলাপের জন্য ইনটেন্টফিল্টার তৈরি করুন এবং এটি নিবন্ধ করুন।

@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?
এমআর 5

3
আপনি যদি একাধিকবার নিবন্ধনকারীকে কল করেন এবং নিবন্ধভুক্ত রিসিভারটি কেবল একবার একবার পান তবে রিসিভারের পূর্ববর্তী উদাহরণটি ফাঁস হতে পারে। সুতরাং আপনি যে দৃষ্টান্তটি নিবন্ধভুক্ত করেন তা নিবন্ধভুক্ত করার জন্য সেই উদাহরণটি ব্যবহার করে।
পবন যাদব

2
যদি আপনি একই ক্রিয়ায় একাধিকবার নিবন্ধন করতে চান তবে আমি বলতে চাই যে আপনার চিন্তিত হওয়া উচিত।
stdout- এ

1
এই নিরুৎসাহিত করা উচিত নয়? আপনি একই ব্রডকাস্টার্সিসিভারটিকে একাধিকবার নিবন্ধভুক্ত করলে গুগল ডেভস একটি ব্যতিক্রম ছুঁড়ে ফেলা সহায়ক হবে। পরিবর্তে আমাদের উদ্দেশ্য ফিল্টারে একাধিক ক্রিয়া যুক্ত করা উচিত।
TheRealChx101
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.