java - 广播接收器和内存泄漏

标签 java android memory-leaks android-service android-broadcastreceiver

在我的应用程序中;我想在我的所有服务中接收网络连接更改,因为我必须在本地和服务器上管理数据库。

我已经制作了 BaseConnectivityService,它具有连接更改的接收器,如下所示:

public abstract class BaseConnectivityService extends IntentService {

    private ConnectivityManager mConnectivityManager;

    public BaseConnectivityService(String name) {
        super(name);
    }

    @Override
    public void onCreate() {
        super.onCreate();
        mConnectivityManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
        registerReceivers();
    }

    @Override
    public void onDestroy() {
        unregisterReceivers();
        mConnectivityManager = null;
        super.onDestroy();
    }

    private void registerReceivers() {
        IntentFilter connectivityIntentFilter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
        registerReceiver(mConnectivityChangeReceiver, connectivityIntentFilter);
    }

    private void unregisterReceivers() {
        unregisterReceiver(mConnectivityChangeReceiver);
    }

    /**
     * will be invoked when network connectivity has been changed and network is in connected state
     */
    protected abstract void onNetworkConnected();

    /**
     * will be invoked when network connectivity has been changed and network is NOT in connected state
     */
    protected abstract void onNetworkDisconnected();

    /**
     * checks whether network is available and is in connected state
     *
     * @return true if network is connected; false otherwise
     */
    protected final boolean isNetworkConnected() {
        NetworkInfo activeNetworkInfo = mConnectivityManager.getActiveNetworkInfo();
        return activeNetworkInfo != null && activeNetworkInfo.isAvailable() && activeNetworkInfo.isConnected();
    }


    private final BroadcastReceiver mConnectivityChangeReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (isNetworkConnected()) {
                onNetworkConnected();
            } else {
                onNetworkDisconnected();
            }
        }
    };
}

现在,如果我使用 BaseConnectivityService 扩展我的所有服务;是否会导致内存泄漏,因为系统会将服务保留在内存中以通知连接更改?

我已阅读 this thread ;这是有点类似的问题。 正如马克·墨菲 (Mark Murphy) 所写:

You will leak memory, as your BroadcastReceiver will keep the component in RAM (even if it was destroyed) until such time as Android terminates the process.

是否适用于我的场景?如果是,什么是避免内存泄漏和获得网络连接更改通知的好解决方案?

最佳答案

查看同一线程中的最后一个响应。您可以从服务类注册和取消注册广播接收器。如果与服务生命周期绑定(bind),就没有泄漏的机会。

关于java - 广播接收器和内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35329994/

相关文章:

java - 将随机字节缩放到选定的整数范围

java - Uni<Void> 如何在 REST 调用中获得失败或成功响应

html5 canvas 应用程序中的 JavaScript base64 图像源内存管理

linux-kernel - 调试文件描述符泄漏(在内核中?)

java - Java JMF 中的音频 channel 选择

java - ($Proxy6) org.postgresql.jdbc4.Jdbc4Connection@5894585b,这是什么意思?

android - 警报对话框显示非常缓慢

android - 在 android 上的 firebase 中发送推送通知的用户操作

android - 谷歌钱包、商户账户和沙箱

php - NSURL请求:EXC_BAD_ACCESS