在我的应用程序中;我想在我的所有服务中接收网络连接更改,因为我必须在本地和服务器上管理数据库。
我已经制作了 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/