0

I am using BroadcastReceiver in my Main activity and register it at OnCreate and trying to unRegister it onDestroy but some time application crashing as it stating that i am trying to unregister a receiver which already unregister. Here is my code:

@Override
    public void onCreate(Bundle savedInstanceState) {
        ...
LocalBroadcastManager.getInstance(this).registerReceiver(forceLogoutRequest, new IntentFilter(CommonUtils.FORCE_LOGOUT));
}

 @Override
    public void onDestroy() {
 super.onDestroy();
if(forceLogoutRequest!=null) {
            unregisterReceiver(forceLogoutRequest);
            forceLogoutRequest = null;
        }
}


  private BroadcastReceiver forceLogoutRequest = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            ..
            ..

        }
    };

This is what i am getting in console:

 10-12 13:28:34.644 5772-6344/? E/AndroidRuntime: FATAL EXCEPTION: main
  Process: com.myapp.nurse, PID: 5772
  java.lang.RuntimeException: Unable to destroy activity   java.lang.IllegalArgumentException: Receiver not registered: com.myapp.hp.nurse.activity.MainActivity$5@1a174913
      at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3812)
      at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:3830)
      at android.app.ActivityThread.access$1400(ActivityThread.java:156)
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1405)
      at android.os.Handler.dispatchMessage(Handler.java:102)
      at android.os.Looper.loop(Looper.java:211)
      at android.app.ActivityThread.main(ActivityThread.java:5373)
      at java.lang.reflect.Method.invoke(Native Method)
      at java.lang.reflect.Method.invoke(Method.java:372)
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1020)
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:815)
   Caused by: java.lang.IllegalArgumentException: Receiver not registered: com.myapp.hp.nurse.activity.MainActivity$5@1a174913
      at android.app.LoadedApk.forgetReceiverDispatcher(LoadedApk.java:771)
      at android.app.ContextImpl.unregisterReceiver(ContextImpl.java:1671)
      at android.content.ContextWrapper.unregisterReceiver(ContextWrapper.java:511)
      at com.myapp.hp.nurse.activity.MainActivity.onDestroy(MainActivity.java:327)
      at com.myapp.hp.nurse.activity.NfcEnabledActivity.onDestroy(NfcEnabledActivity.java:49)
      at android.app.Activity.performDestroy(Activity.java:6169)
      at android.app.Instrumentation.callActivityOnDestroy(Instrumentation.java:1141)
      at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3799)
      at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:3830) 
      at android.app.ActivityThread.access$1400(ActivityThread.java:156) 
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1405) 
      at android.os.Handler.dispatchMessage(Handler.java:102) 
      at android.os.Looper.loop(Looper.java:211) 
      at android.app.ActivityThread.main(ActivityThread.java:5373) 
      at java.lang.reflect.Method.invoke(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:372) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1020) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:815) 
      10-12 13:28:36.316 5772-6344/? I/Process: Sending signal. PID: 5772 SIG: 9
user565
  • 871
  • 1
  • 22
  • 47
  • It could be the receiver is killed before you try to kill it – Zoe Oct 12 '17 at 11:42
  • check this https://stackoverflow.com/questions/6165070/receiver-not-registered-exception-error/24391706#24391706 – tamtom Oct 12 '17 at 11:42
  • Possible duplicate of [Receiver not registered exception error?](https://stackoverflow.com/questions/6165070/receiver-not-registered-exception-error) – Abdul Waheed Oct 12 '17 at 11:43

2 Answers2

4

Use this instead

LocalBroadcastManager.getInstance(this).unregisterReceiver(forceLogoutRequest);

For more info about using the localBroadCastManager checke this link https://developer.android.com/reference/android/support/v4/content/LocalBroadcastManager.html

Sharath kumar
  • 4,064
  • 1
  • 14
  • 20
3

First in order to unregister the receiver, you need to use LocalBroadcastManager

 LocalBroadcastManager.getInstance(this).unregisterReceiver(YOURRECEIVER);

then you should unregister your receiver on pause and not on destroy

ramon22
  • 3,528
  • 2
  • 35
  • 48