2012-02-03 26 views
79

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?

Trả lời

153

thay vào đó, bạn có thể cung cấp hai bộ lọc ý định khác nhau:

lọc cho refresh chỉ

IntentFilter filterRefresh = new IntentFilter(Params.INTENT_REFRESH); 

lọc cho làm mới và cập nhật

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

bây giờ bạn có thể chuyển đổi giữa các bộ lọc ý định bằng cách đăng ký và bỏ đăng ký mong muốn nhưng việc thực hiện của người nhận sẽ giống nhau

+0

Cảm ơn, đây là giải pháp tốt hơn và hoạt động tốt hơn. –

+0

@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

+2

@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

23

Đối với mỗi hành động, tạo IntentFilter và đăng ký nó.

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

} 
+1

Tôi có nên lo lắng khi gọi 'registerReceiver' nhiều lần và gọi' unregisterReceiver' một lần duy nhất? – mr5

+2

Nếu u gọi registerReceiver nhiều lần và unregisterReceiver chỉ một lần sau đó trường hợp trước đó của người nhận có thể bị rò rỉ. Vì vậy, dụ u đăng ký sau đó sử dụng trường hợp đó cho unregister. –

+1

Nếu bạn đăng ký nhiều lần trên cùng một hành động, thì tôi sẽ nói bạn nên lo lắng. – zgulser

Các vấn đề liên quan