私は2つの異なる放送をキャッチする必要があるAndroidのアクティビティを持っています。私の現在のアプローチは、活動中の単一BroadcastReceiver
を持っており、それとの両方の放送をキャッチすることです:複数のフィルタまたは複数のBroadcastReceiversを備えた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
に登録されている2つのフィルタのうち1つだけを登録解除する方法が見つかりませんでした。したがって、状態によっては、INTENT_REFRESH
ブロードキャストが捕捉されたときに実行されるアクションを有効または無効にするフラグを使用します。アクティビティの
質問はです:これは正しいアプローチですか?
あるいは、次のように2つの別々のBroadcastReceiversを持っている方が良いでしょう:
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);
を更新:
ありがとう、これははるかに良い解決策であり、動作します。 –
@Waqas複数のインテントを受信するBroadcastReceiverの実装例を提供できますか?それはちょうど大きなif-then-elseステートメントですか? – gonzobrains
@gonzobrainsはい、複数のインテントに対しては、それらをフィルタリングするために等しい数のif-elseステートメントを使用する必要があります。 – waqaslam