¿Cómo comprobar si Receiver está registrado en Android?

Necesito comprobar si mi receptor registrado todavía está registrado si no cómo comprobarlo cualquier método?

No estoy seguro de que la API proporcione directamente una API, si considera este hilo :

Me preguntaba lo mismo.
En mi caso, tengo una implementación BroadcastReceiver que llama a Context#unregisterReceiver(BroadcastReceiver) pasándose por sí mismo como arg después de manejar el Intent que recibe.
Existe una pequeña posibilidad de que el onReceive(Context, Intent) del receptor se llame más de una vez, ya que está registrado con múltiples IntentFilters , creando la posibilidad de que una IllegalArgumentException sea ​​lanzada desde Context#unregisterReceiver(BroadcastReceiver) .

En mi caso puedo almacenar un miembro sincronizado privado para comprobar antes de llamar a Context#unregisterReceiver(BroadcastReceiver) , pero sería mucho más limpio si la API proporcionó un método de verificación.

No hay función de API para comprobar si un receptor está registrado. La solución es poner el código en un bloque try {...} catch(IllegalArgumentException e) {...} .

Estoy usando esta solución

 public class ReceiverManager { private static List<BroadcastReceiver> receivers = new ArrayList<BroadcastReceiver>(); private static ReceiverManager ref; private Context context; private ReceiverManager(Context context){ this.context = context; } public static synchronized ReceiverManager init(Context context) { if (ref == null) ref = new ReceiverManager(context); return ref; } public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter intentFilter){ receivers.add(receiver); Intent intent = context.registerReceiver(receiver, intentFilter); Log.i(getClass().getSimpleName(), "registered receiver: "+receiver+" with filter: "+intentFilter); Log.i(getClass().getSimpleName(), "receiver Intent: "+intent); return intent; } public boolean isReceiverRegistered(BroadcastReceiver receiver){ boolean registered = receivers.contains(receiver); Log.i(getClass().getSimpleName(), "is receiver "+receiver+" registered? "+registered); return registered; } public void unregisterReceiver(BroadcastReceiver receiver){ if (isReceiverRegistered(receiver)){ receivers.remove(receiver); context.unregisterReceiver(receiver); Log.i(getClass().getSimpleName(), "unregistered receiver: "+receiver); } } } 

Tienes varias opciones

  1. Puedes poner una bandera en tu clase o actividad. Ponga una variable booleana en su clase y mire esta bandera para saber si tiene el Receptor registrado.

  2. Cree una clase que extienda el receptor y allí usted puede utilizar:

    1. Singleton pattern para sólo tener una instancia de esta clase en su proyecto.

    2. Implementar los métodos para saber si el Receptor está registrado.

Solución más simple

En el receptor:

 public class MyReceiver extends BroadcastReceiver { public boolean isRegistered; /** * register receiver * @param context - Context * @param filter - Intent Filter * @return see Context.registerReceiver(BroadcastReceiver,IntentFilter) */ public Intent register(Context context, IntentFilter filter) { try { // ceph3us note: // here I propose to create // a isRegistered(Contex) method // as you can register receiver on different context // so you need to match against the same one :) // example by storing a list of weak references // see LoadedApk.class - receiver dispatcher // its and ArrayMap there for example return !isRegistered ? context.registerReceiver(this, filter) : null; } finally { isRegistered = true; } } /** * unregister received * @param context - context * @return true if was registered else false */ public boolean unregister(Context context) { // additional work match on context before unregister // eg store weak ref in register then compare in unregister // if match same instance return isRegistered && unregisterInternal(context); } private boolean unregisterInternal(Context context) { context.unregisterReceiver(this); isRegistered = false; return true; } // rest implementation here // or make this an abstract class as template :) ... } 

en codigo:

 MyReceiver myReceiver = new MyReceiver(); myReceiver.registerReceiver(Conext, IntentFilter); // register myReceiver.unregister(Context); // unregister 

Editar I

— en respuesta a

Esto realmente no es tan elegante porque usted tiene que recordar fijar la bandera isRegistered después de que usted se registre. – Rabino de sigilo

– método más "ellegant way" añadido en el receptor para registrar y establecer el flag

Si pone esto en el método onDestroy o onStop. Creo que cuando la actividad se ha creado de nuevo MessageReciver no se estaba creando.

 @Override public void onDestroy (){ super.onDestroy(); LocalBroadcastManager.getInstance(context).unregisterReceiver(mMessageReceiver); } 

Puedes hacerlo fácil

1) crear una variable booleana …

 private boolean bolBroacastRegistred; 

2) Cuando registre su Broadcast Receiver, establézcalo en TRUE

 ... bolBroacastRegistred = true; this.registerReceiver(mReceiver, new IntentFilter(BluetoothDevice.ACTION_FOUND)); .... 

3) En la onPause () hacerlo …

 if (bolBroacastRegistred) { this.unregisterReceiver(mReceiver); bolBroacastRegistred = false } 

Simplemente, y ahora, no recibirá más mensaje de error de excepción en onPause ().

Tip1: Siempre use el unregisterReceiver () en onPause () no en onDestroy () Tip2: No se olvide de establecer la variable bolBroadcastRegistred a FALSE cuando se ejecuta el unregisterReceive ()

¡Éxito!

Tienes que usar try / catch:

 try { if (receiver!=null) { Activity.this.unregisterReceiver(receiver); } } catch (IllegalArgumentException e) { e.printStackTrace(); } 

Utilicé el intento para permitir que el receptor de la difusión sabía sobre la instancia de Handler del hilo principal de la actividad y utilizó el mensaje para pasar un mensaje a la actividad principal

He utilizado tal mecanismo para comprobar si el receptor de la difusión está registrado ya o no. A veces se necesita cuando registra su Broadcast Receiver dinámicamente y no quiere hacerlo dos veces o presenta al usuario si Broadcast Receiver está funcionando.

Actividad principal:

 public class Example extends Activity { private BroadCastReceiver_example br_exemple; final Messenger mMessenger = new Messenger(new IncomingHandler()); private boolean running = false; static class IncomingHandler extends Handler { @Override public void handleMessage(Message msg) { running = false; switch (msg.what) { case BroadCastReceiver_example.ALIVE: running = true; .... break; default: super.handleMessage(msg); } } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); IntentFilter filter = new IntentFilter(); filter.addAction("pl.example.CHECK_RECEIVER"); br_exemple = new BroadCastReceiver_example(); getApplicationContext().registerReceiver(br_exemple , filter); //register the Receiver } // call it whenever you want to check if Broadcast Receiver is running. private void check_broadcastRunning() { /** * checkBroadcastHandler - the handler will start runnable which will check if Broadcast Receiver is running */ Handler checkBroadcastHandler = null; /** * checkBroadcastRunnable - the runnable which will check if Broadcast Receiver is running */ Runnable checkBroadcastRunnable = null; Intent checkBroadCastState = new Intent(); checkBroadCastState .setAction("pl.example.CHECK_RECEIVER"); checkBroadCastState .putExtra("mainView", mMessenger); this.sendBroadcast(checkBroadCastState ); Log.d(TAG,"check if broadcast is running"); checkBroadcastHandler = new Handler(); checkBroadcastRunnable = new Runnable(){ public void run(){ if (running == true) { Log.d(TAG,"broadcast is running"); } else { Log.d(TAG,"broadcast is not running"); } } }; checkBroadcastHandler.postDelayed(checkBroadcastRunnable,100); return; } ............. } 

Receptor de radiodifusión:

 public class BroadCastReceiver_example extends BroadcastReceiver { public static final int ALIVE = 1; @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub Bundle extras = intent.getExtras(); String action = intent.getAction(); if (action.equals("pl.example.CHECK_RECEIVER")) { Log.d(TAG, "Received broadcast live checker"); Messenger mainAppMessanger = (Messenger) extras.get("mainView"); try { mainAppMessanger.send(Message.obtain(null, ALIVE)); } catch (RemoteException e) { // TODO Auto-generated catch block e.printStackTrace(); } } ......... } } 

Personalmente utilizo el método de llamar unregisterReceiver y tragar la excepción si es lanzado. Estoy de acuerdo en que es feo, pero el mejor método actualmente proporcionado.

He planteado una solicitud de característica para obtener un método booleano para comprobar si un receptor está registrado agregado a la API de Android. Por favor, admítalo aquí si quieres que se agregue: https://code.google.com/p/android/issues/detail?id=73718

Esto es lo que hice para comprobar si el Broadcaster ya está registrado, incluso si cierras tu aplicación (finish ())

Firstime ejecutando su aplicación, enviar una emisión en primer lugar, devolverá true / false depende de si su emisora ​​sigue funcionando o no.

Mi locutor

 public class NotificationReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if(intent.getExtras() != null && intent.getStringExtra("test") != null){ Log.d("onReceive","test"); return; } } } 

Mi principalActividad

 // init Broadcaster private NotificationReceiver nr = new NotificationReceiver(); Intent msgrcv = new Intent("Msg"); msgrcv.putExtra("test", "testing"); boolean isRegistered = LocalBroadcastManager.getInstance(this).sendBroadcast(msgrcv); if(!isRegistered){ Toast.makeText(this,"Starting Notification Receiver...",Toast.LENGTH_LONG).show(); LocalBroadcastManager.getInstance(this).registerReceiver(nr,new IntentFilter("Msg")); } 

Así es como lo he hecho, es una versión modificada de la respuesta dada por ceph3us y editada por slinden77 (entre otras cosas he eliminado valores de retorno de métodos que no necesitaba):

 public class MyBroadcastReceiver extends BroadcastReceiver{ private boolean isRegistered; public void register(final Context context) { if (!isRegistered){ Log.d(this.toString(), " going to register this broadcast receiver"); context.registerReceiver(this, new IntentFilter("MY_ACTION")); isRegistered = true; } } public void unregister(final Context context) { if (isRegistered) { Log.d(this.toString(), " going to unregister this broadcast receiver"); context.unregisterReceiver(this); isRegistered = false; } } @Override public void onReceive(final Context context, final Intent intent) { switch (getResultCode()){ //DO STUFF } } } 

Luego en una clase de actividad:

 public class MyFragmentActivity extends SingleFragmentActivity{ MyBroadcastReceiver myBroadcastReceiver; @Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); registerBroacastReceiver(); } @Override protected Fragment createFragment(){ return new MyFragment(); } //This method is called by the fragment which is started by this activity, //when the Fragment is done, we also register the receiver here (if required) @Override public void receiveDataFromFragment(MyData data) { registerBroacastReceiver(); //Do some stuff } @Override protected void onStop(){ unregisterBroacastReceiver(); super.onStop(); } void registerBroacastReceiver(){ if (myBroadcastReceiver == null) myBroadcastReceiver = new MyBroadcastReceiver(); myBroadcastReceiver.register(this.getApplicationContext()); } void unregisterReceiver(){ if (MyBroadcastReceiver != null) myBroadcastReceiver.unregister(this.getApplicationContext()); } } 
 if( receiver.isOrderedBroadcast() ){ // receiver object is registered } else{ // receiver object is not registered } 

Sólo marque NullPointerException. Si el receptor no existe, entonces …

 try{ Intent i = new Intent(); i.setAction("ir.sss.smsREC"); context.sendBroadcast(i); Log.i("...","broadcast sent"); } catch (NullPointerException e) { e.getMessage(); } 
  • Cómo bloquear una llamada de número móvil y recepción de mensajes en el desarrollo de aplicaciones Android?
  • Ir a SMS Pro sobreponiendo android.provider.Telephony.SMS_RECEIVED
  • Cómo agregar Snackbars en un BroadcastReceiver?
  • ¿Hay alguna manera de saber si se recibieron las transmisiones de LocalBroadcastManager?
  • Corregir el patrón para adquirir un WakeLock en un BroadcastReceiver y liberarlo en un servicio
  • Actividad de Android sin GUI
  • ¿Cómo detectar cuando un usuario se conecta auriculares en el dispositivo Android? (Opuesto de ACTION_AUDIO_BECOMING_NOISY)
  • Cómo obtener un Broadcastreceiver fiable
  • Android: tener un servicio que se ejecuta todos los días a las 4 de la mañana
  • BroadcastReceiver con múltiples filtros o BroadcastReceivers múltiples?
  • Repetir alarmas cada lunes en Android usig AlarmManager / BroadcastReceiver
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.