与多个过滤器或多个BroadcastReceivers BroadcastReceiver的? [英] BroadcastReceiver with multiple filters or multiple BroadcastReceivers?
问题描述
我有一个Android的活动,需要捕捉两种不同的广播。我目前的做法是有一个的BroadcastReceiver
的活动范围内,并用它赶上这两个节目:
I have an Android Activity that needs to catch two different broadcasts. My current approach is to have a single BroadcastReceiver
within the Activity and catch both the broadcasts with it:
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();
}
}
}
}
我要执行刷新()
仅在我的活动是在屏幕上可见,但我想赶 INTENT_UPDATE
并执行更新()
活动的整个生命周期,无论该行为是否是可见或不可见时。
I want to execute refresh()
only if my Activity is visible on the screen, but I want to catch INTENT_UPDATE
and execute update()
during the entire lifetime of the Activity, regardless of whether the Activity is visible or not.
我没有找到任何办法只能注销,我注册的的onCreate
的两个过滤器中的一个,所以我用一个标志来启用或禁用动作要执行时, INTENT_REFRESH
广播被捕获,根据活动的状态。
I didn't find any way to unregister only one of the two filters that I register in onCreate
, so I use a flag to enable or disable the action to be executed when the INTENT_REFRESH
broadcast is caught, depending on the state of the Activity.
现在的问题是:这是正确的做法。
或者,会是最好有两个单独的BroadcastReceivers如下:
Or, would it be better to have two separate BroadcastReceivers as follows:
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();
}
}
}
}
和哪一个具有更好的性能?
And which one has better performance?
推荐答案
相反,你可能会提供两种不同的意图过滤器:
instead, you may provide two different intent filters:
过滤器,只刷新
IntentFilter filterRefresh = new IntentFilter(Params.INTENT_REFRESH);
过滤器进行刷新和更新
filter for refresh and update
IntentFilter filterRefreshUpdate = new IntentFilter();
filter.addAction(Params.INTENT_REFRESH);
filter.addAction(Params.INTENT_UPDATE);
现在你可能意图过滤器之间通过注册和未注册所需要的人,但你的接收机的实施将是相同的切换
now you may switch between intent filters by registering and un-registering the desired one but your receiver's implementation would be same
这篇关于与多个过滤器或多个BroadcastReceivers BroadcastReceiver的?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!