Tôi có một Hoạt động trên Android cần nắm bắt hai chương trình phát sóng khác nhau. Cách tiếp cận hiện tại của tôi là phải có một đơn BroadcastReceiver
trong hoạt động và bắt cả hai chương trình phát sóng với nó:BroadcastReceiver với nhiều bộ lọc hoặc nhiều BroadcastReceivers?
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();
}
}
}
}
Tôi muốn thực hiện refresh()
chỉ khi Hoạt động của tôi có thể nhìn thấy trên màn hình, nhưng tôi muốn bắt INTENT_UPDATE
và thực hiện update()
trong suốt toàn bộ thời gian của Hoạt động, bất kể Hoạt động có hiển thị hay không.
Tôi không tìm thấy cách nào để hủy đăng ký chỉ một trong hai bộ lọc mà tôi đăng ký trong onCreate
, vì vậy tôi sử dụng cờ để bật hoặc tắt hành động được thực thi khi phát sóng INTENT_REFRESH
tùy thuộc vào trạng thái Hoạt động.
Câu hỏi là: đây có phải là cách tiếp cận chính xác không?
Hoặc, nó sẽ tốt hơn nếu có hai BroadcastReceivers riêng biệt như sau:
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();
}
}
}
}
Và cái nào có hiệu suất tốt hơn?
Cảm ơn, đây là giải pháp tốt hơn và hoạt động tốt hơn. –
@Waqas Bạn có thể cung cấp triển khai ví dụ về BroadcastReceiver sẽ nhận được nhiều ý định không? Nó chỉ là một tuyên bố lớn nếu-thì-khác? – gonzobrains
@gonzobrains có, với nhiều ý định, bạn cần phải sử dụng số lượng báo cáo if-else bằng nhau để lọc chúng ra – waqaslam