Search code examples
androidandroid-intentmemory-leaksandroid-broadcastreceiver

Activity has leaked IntentReceiver even after unregistered


Before marking it as duplicate, please read through full description (had bad experience this week).

Here is my code, to be sure I added registering and unregistering in all five methods. myReceiver is a class level private non static member.

    @Override
    public void onPause() {
        super.onPause();
        UnRegisterInternetBroadcast();
        storePreferences();
    }

    @Override
    public void onResume() {
        super.onResume();
        RegisterInternetBroadcast();
    }

    @Override
    protected void onStop()
    {
        UnRegisterInternetBroadcast();
        super.onStop();
    }
    @Override
    protected void onDestroy() {
        UnRegisterInternetBroadcast();
        super.onDestroy();
    }

I do not have <receiver> defined in my Manifest xml. All I have is below code to handle.

    public void RegisterInternetBroadcast() {
        if(myReceiver == null) {
            IntentFilter filter = new IntentFilter();
            filter.addAction(getPackageName() + "android.net.conn.CONNECTIVITY_CHANGE");
            myReceiver = new InternetConnectionReceiver();
            registerReceiver(myReceiver, filter);
            myReceiver = null;
        }
        System.gc();
    }

    public void UnRegisterInternetBroadcast() {
        if(myReceiver != null) {
            myReceiver.clearAbortBroadcast();
            unregisterReceiver(myReceiver);
        }
    }

As per other articles over internet and questions in stackoverflow I should not be receiving any memory leaks. Any missing things in my code? targetSdkVersion is 25 and I am testing in Marshmallow OS.

Regards,

Harsha


Solution

  • You set myReceiver = null; in RegisterInternetBroadcast() but that causes the UnRegisterInternetBroadcast() to fail, since the receiver is null.

    Remove that line and it should work.