2012-02-03 14 views
79

私は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); 

を更新:

答えて

153

代わりに、次の2つの異なるインテントフィルタを提供することができますあなたのレシーバーの実装は同じになるでしょう

+0

ありがとう、これははるかに良い解決策であり、動作します。 –

+0

@Waqas複数のインテントを受信するBroadcastReceiverの実装例を提供できますか?それはちょうど大きなif-then-elseステートメントですか? – gonzobrains

+2

@gonzobrainsはい、複数のインテントに対しては、それらをフィルタリングするために等しい数のif-elseステートメントを使用する必要があります。 – waqaslam

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

+2

uがregisterReceiverを複数回呼び出し、unregisterReceiverを1回だけ呼び出すと、受信者の前のインスタンスがリークする可能性があります。したがって、インスタンスuは登録解除のためにそのインスタンスを使用して登録します。 –

+1

同じ行動に複数回登録するのであれば、心配するべきだと思います。 – zgulser

関連する問題