2012-02-03 20 views
79

İki farklı yayını yakalaması gereken bir Android Etkinliğim var. Benim şu anki yaklaşımı Aktivite içinde tek BroadcastReceiver var ve onunla hem yayınları yakalamaktır:BroadcastReceiver çoklu filtreler veya birden fazla 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(); 
      } 
     } 
    } 
} 

benim Etkinlik ekranda görünür olması halinde refresh() yürütmek istiyorum ama INTENT_UPDATE yakalamak ve yürütmek istiyorum Aktivitenin görünür olup olmadığına bakılmaksızın, Etkinliğin tüm ömrü boyunca update().

onCreate'a kaydettiğim iki filtreden yalnızca birini kaydetmenin bir yolunu bulamadım, bu yüzden, duruma bağlı olarak INTENT_REFRESH yayını yakalandığında yürütülecek eylemi etkinleştirmek veya devre dışı bırakmak için bir bayrak kullanıyorum Faaliyetin

Soru: Bu doğru yaklaşım mı?

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

Ve hangisinin daha iyi performans gösterir: aşağıdaki gibi iki ayrı Yayın Alıcılarının olması

Veya daha iyi olurdu? yenileme için sadece

IntentFilter filterRefresh = new IntentFilter(Params.INTENT_REFRESH); 

filtre yenileme için

filtreyi ve şimdi

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

Eğer kaydederek niyet filtreleri arasında geçiş yapabilir güncellemek:

cevap

153

yerine, iki farklı amaç filtreleri sağlayabilir ve istediğinizi kaydetmeden ancak alıcınızın uygulaması aynı olacaktı

+0

Teşekkürler, bu çok daha iyi bir çözümdür ve çalışır. –

+0

@Waqas BroadcastReceiver'ın çoklu amaç alabilecek örnek bir uygulamasını sağlayabilir misiniz? Sadece büyük bir if-o-else ifadesi mi? – gonzobrains

+2

@gonzobrains evet, birden fazla amaç için bunları filtrelemek için eşit sayıda if-else ifadesi kullanmanız gerekir – waqaslam

23

Her eylem için IntentFilter'ı oluşturun ve kaydedin.

@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

Birden çok kez "registerReceiver" çağırmaktan ve "unregisterReceiver" tek seferde çağırmaktan endişelenmemeli miyim? – mr5

+2

Eğer birden çok kez registerReceiver çağırır ve unregisterReceiver öğesini bir kez çağırırsanız, önceki alıcı örneği sızabilir. Bu yüzden, kayıt edildikten sonra o örneği kullanarak kayıt olun. –

+1

Aynı eylemde birden çok kez kayıt olsaydınız, endişelenmeniz gerektiğini söylerdim. – zgulser

İlgili konular