2012-02-03 46 views
79

我有一个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(),无论Activity是否可见。

我没有找到任何办法只能注销,我在onCreate注册两个过滤器中的一个,所以我用一个标志来启用或禁用动作INTENT_REFRESH广播被捕获时,根据不同的状态下执行的活动。

问题是:这是正确的做法吗?

或者,那会是最好有两个独立的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(); 
      } 
     } 
    } 
} 

,哪一个具有更好的性能?

回答

153

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

进行刷新过滤器只刷新

IntentFilter filterRefresh = new IntentFilter(Params.INTENT_REFRESH); 

过滤器和更新

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

现在你可以通过注册的意图过滤器之间切换并取消注册所需的一个,但您的接收器的实施将是相同的

+0

谢谢,这是一个更好的解决方案,它的工作原理。 – 2012-02-03 13:59:54

+0

@Waqas您能否提供一个可以接收多个意向的BroadcastReceiver的示例实现?这只是一个很大的if-then-else声明吗? – gonzobrains 2013-05-08 23:01:17

+2

@gonzobrains是的,对于多个意图,你需要使用相同数量的if-else语句来过滤掉它们 – waqaslam 2013-05-08 23:10:57

23

对于每个操作,创建IntentFilter并注册它。

@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

我不应该担心多次调用'registerReceiver'并且只调用一次'unregisterReceiver'吗? – mr5 2015-08-11 08:06:49

+2

如果你多次调用registerReceiver并且只注册一次,那么以前的接收器实例可能会泄漏。所以实例你注册然后使用该实例注销。 – 2015-08-11 14:23:52

+1

如果你要多次注册同一个动作,那么我会说你应该担心。 – zgulser 2015-12-23 08:36:05