即使在未注册后,Activity也泄露了IntentReceiver

时间:2017-09-24 20:53:23

标签: android android-intent memory-leaks android-broadcastreceiver

在将其标记为重复之前,请仔细阅读完整描述(本周有糟糕的经历)。

这是我的代码,确保我在所有五种方法中添加了注册和取消注册。 myReceiver是一个类级私有非静态成员。

    @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();
    }

我的Manifest xml中没有定义<receiver>。我所拥有的只是代码来处理。

    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);
        }
    }

根据互联网上的其他文章和stackoverflow中的问题,我不应该收到任何内存泄漏。我的代码中有什么遗漏的东西? targetSdkVersion是25,我正在测试Marshmallow OS。

此致

2 个答案:

答案 0 :(得分:0)

您也应该在onDestroy()方法中取消注册该服务。

答案 1 :(得分:0)

您在myReceiver = null;中设置了RegisterInternetBroadcast(),但这导致UnRegisterInternetBroadcast()失败,因为接收方为空。

删除该行,它应该有效。

相关问题