我有一个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广播时要执行的操作,具体取决于活动的状态.

The question is:这是正确的方法吗?

或者,最好有两个单独的广播接收器,如下所示:

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

那么哪一个的性能更好呢?

推荐答案

相反,您可以提供两种不同的意图过滤器:

仅用于刷新的过滤器

IntentFilter filterRefresh = new IntentFilter(Params.INTENT_REFRESH);

刷新和更新过滤器

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

现在,您可以通过注册和注销所需的意图过滤器来在意图过滤器之间切换,但是您的接收者的实现是相同的

Android相关问答推荐

Android:点击操作栏返回按钮后应用程序无react

如何使TextField的背景透明?

ENV变量在gradle进程中没有更新

显示本地房间数据库中未保存的项目的动态列表

滚动屏幕时更改按钮外观

Android Jetpack Compose Material3主题配色方案

如何在Android Studio的LinearLayout中禁用阴影

使用Android Jetpack Compose,为子Composable定义ViewModel是不是一种糟糕的做法?

OverridePendingTransition已弃用,我该怎么办?

从包含的(复合)模块导入 Kotlin 类时,Android 应用程序模块的 build.gradle.kts 未解决的引用错误

有没有办法迭代类型安全的项目访问器?

如何在 Jetpack Compose 中对齐按钮底部中心?

如何在Android中使用嵌套的Recyclerview

浏览器未命中断点判断 USB 连接设备

NFC getNdefMessage 在 Android 13 上写入标签后返回 null

为什么项目捕获对象给我在 Compose 中找不到参考

Compose Accompaniist Pager 中的 TabRow/Tab 重组问题

Jetpack compose 为网络检索视频帧导致延迟

如何在 Android 上移动 EditText 上的图标?

Android WebView 没有在第一次页面完成时从本地存储读取数据?