여러 필터 또는 여러 BroadcastReceiver가있는 BroadcastReceiver?


115

두 개의 다른 방송을 포착해야하는 Android 활동이 있습니다. 내 현재 접근 방식은 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하여 활동 상태에 따라 브로드 캐스트가 잡힐 때 실행되는 작업을 활성화하거나 비활성화합니다 .

문제는 이것이 올바른 접근 방식입니까?

또는 다음과 같이 두 개의 개별 BroadcastReceiver를 사용하는 것이 더 낫습니다.

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 여러 인 텐트를 수신하는 BroadcastReceiver 구현 예를 제공 할 수 있습니까? 큰 if-then-else 문입니까?
gonzobrains 2013 년

2
@gonzobrains 예, 여러 인 텐트의 경우 동일한 수의 if-else 문을 사용하여 필터링해야합니다
waqaslam

@Waqas이 작업을 동적으로 수행하여 일반 브로드 캐스트 수신기가 있고 새 인 텐트를 추가 할 때마다 기본 프레임 워크를 수정할 필요가 없도록 여러 핸들러를 추가 할 수있는 방법이 있습니까?
gonzobrains

"동적으로이 작업을 수행 한다 " 는 것이 정확히 무엇을 의미 합니까? 인 텐트 필터 내에 모든 작업 문자열을 포함하고 if-else를 수행하여 필요한 작업 문자열을 식별하기 만하면됩니다.
waqaslam

3
이 답변에 대한 모든 찬성 투표를 이해하지 못합니다. 작업이 수행하려는 작업에 대해 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
registerReceiver를 여러 번 호출하고 unregisterReceiver를 한 번만 호출하면 이전 수신기 인스턴스가 누출 될 수 있습니다. 따라서 인스턴스 u는 등록 취소를 위해 해당 인스턴스를 사용합니다.
Pawan Yadav

2
같은 행동에 여러 번 등록했다면 걱정해야한다고 말하고 싶습니다.
표준 출력

1
이것은 낙심해야하지 않습니까? 동일한 BroadcastReceiver를 두 번 이상 등록 할 때 Google 개발자가 예외를 throw하는 것이 도움이됩니다. 대신 인 텐트 필터에 여러 작업을 추가해야합니다.
TheRealChx101
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.