Broadcast receiver not registered

1.1k Views Asked by At

I am having an error where I register a broadcast receiver in the constructor. However, when I unregister it in onPause it throws an exception about not being registered. How can this be and can you help me solve the problem.

The main problem is that I am bound to a NetworkService class, which I also can't unbind from. It gives problems when I restart the app and says that I have a "leak". But I don't know which of the two problems generating the leak.

Here is my code:

Constants

private static NetworkService networkService;
private ServiceConnection networkServiceConnection;
private BroadcastReceiver networkServiceMessageReceiver;
private boolean boundToService;

OnCreate

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_splash);

    /** Defines callbacks for service binding, passed to bindService() */
    networkServiceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName componentName, IBinder service) {
            NetworkService.LocalBinder binder = (NetworkService.LocalBinder) service;
            networkService = binder.getService();
            boundToService = true;

            LocalBroadcastManager.getInstance(SplashActivity.this).registerReceiver(networkServiceMessageReceiver, new IntentFilter(NetworkService.CHECK_FOR_UPDATE_RESULT));
            checkForUpdate();
        }

        @Override
        public void onServiceDisconnected(ComponentName componentName) {
            boundToService = false;
        }
    };
}

OnResume

@Override
protected void onResume() {
    super.onResume();

    //Bind to NetworkService
    if(!boundToService)
    {
        Intent intent = new Intent(this, NetworkService.class);
        bindService(intent, networkServiceConnection, Context.BIND_AUTO_CREATE);
    }
}

OnPause

@Override
protected void onPause() {
    super.onPause();

    unregisterReceiver(networkServiceMessageReceiver);
}

OnStop

@Override
protected void onStop() {
    super.onStop();

    unbindService(networkServiceConnection);
}
2

There are 2 best solutions below

0
On BEST ANSWER

You are calling unregisterReceiver() on the Activity context, but you are calling registerReceiver() on the LocalBroadcastManager context. This can't work. You need to register and unregister on the same Context.

Make sure you only unregister if your Service has already been bound, otherwise you won't have called register().

Also, since you are unregistering in onPause() you need to reregister in onResume().

0
On

I am having an error where I register a broadcast receiver in the constructor. However, when I unregister it in onPause it throws an exception abaout not being registered.

You are registering your broadcast inside service connection which depends upon the connection result. Connection result onServiceConnected takes some time after binding service. Same time if onPause gets called it throws an exception about not being registered.

Easy solution, just add null check for networkServiceMessageReceiver, if it is not null then only unregister as well once you are unregistering assigned it to null.