tutorial studio start sendbroadcast registerreceiver oreo intent example date_changed android android-intent broadcastreceiver

android - studio - BroadcastReceiver con múltiples filtros o múltiples BroadcastReceivers?



start broadcast receiver android (2)

Tengo una actividad de Android que necesita atrapar dos transmisiones diferentes. Mi enfoque actual es tener un solo BroadcastReceiver dentro de la Actividad y atrapar ambas transmisiones con él:

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

Quiero ejecutar refresh() solo si mi Activity está visible en la pantalla, pero quiero capturar INTENT_UPDATE y ejecutar update() durante toda la vida de la actividad, independientemente de si la actividad es visible o no.

No encontré ninguna manera de anular el registro de solo uno de los dos filtros que registro en onCreate , así que utilizo un indicador para habilitar o deshabilitar la acción que se ejecutará cuando se INTENT_REFRESH transmisión INTENT_REFRESH , dependiendo del estado de la Actividad.

La pregunta es : ¿es este el enfoque correcto?

O, ¿sería mejor tener dos BroadcastReceivers por separado de la siguiente manera:

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

¿Y cuál tiene mejor rendimiento?


Para cada acción, cree IntentFilter y regístrelo.

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


en su lugar, puede proporcionar dos filtros de intención diferentes:

filtro solo para actualización

IntentFilter filterRefresh = new IntentFilter(Params.INTENT_REFRESH);

filtro para actualización y actualización

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

ahora puede cambiar entre filtros de intención registrando y anulando el registro deseado, pero la implementación de su receptor sería la misma