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 aBroadcastReceiver
implementation that callsContext#unregisterReceiver(BroadcastReceiver)
passing itself as the argument after handling the Intent that it receives.
There is a small chance that the receiver'sonReceive(Context, Intent)
method is called more than once, since it is registered with multipleIntentFilters
, creating the potential for anIllegalArgumentException
being thrown fromContext#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 :)