How to check if Receiver is registered in Android? How to check if Receiver is registered in Android? android android

How to check if Receiver is registered in Android?


There is no API function to check if a receiver is registered. The workaround is to put your code in a try catch block as done below.

try { //Register or UnRegister your broadcast receiver here} catch(IllegalArgumentException e) {    e.printStackTrace();}


I am not sure the API provides directly an API, if you consider this thread:

I was wondering the same thing.
In my case I have a BroadcastReceiver implementation that calls Context#unregisterReceiver(BroadcastReceiver) passing itself as the argument after handling the Intent that it receives.
There is a small chance that the receiver's onReceive(Context, Intent) method is called more than once, since it is registered with multiple IntentFilters, creating the potential for an IllegalArgumentException being thrown from Context#unregisterReceiver(BroadcastReceiver).

In my case, I can store a private synchronized member to check before calling Context#unregisterReceiver(BroadcastReceiver), but it would be much cleaner if the API provided a check method.


simplest solution

in receiver:

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 :)    ...}

in code:

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

ad 1

-- in reply to:

This really isn't that elegant because you have to remember to set the isRegistered flag after you register. – Stealth Rabbi

-- "more ellegant way" added method in receiver to register and set flag

this won't work If you restart the device or if your app got killed by OS. – amin 6 hours ago

@amin - see lifetime of in code (not system registered by manifest entry) registered receiver :)