监听网络变化方式
一 传统的广播
二 5.0以上 使用 ConnectivityManager
权限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
常用方法大致可分为三类:
- 获取网络链接信息getXXX如getActiveNetwork,getDefaultProxy
- 多网络链接绑定指定网络 bindsocket和bindprocesstonetwork(6.0的系统 api>23)
- 监听类型 registerDefaultNetworkCallback/registerNetworkCallback
ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
getAllNetworkInfo(): 返回所有网络信息
getActiveNetworkInfo():获取当前激活的网络连接信息
getNetworkForType(): 获取指定类型的网络
requestNetwork(...) : 请求建立某种类型的网络
setAirplaneMode(): 开启飞行模式
addDefaultNetworkActiveListener() : 监听默认网络连接是否激活
registerNetworkCallback() : 监听某个网络请求的状态,可用时进行回调
unregisterNetworkCallback():与 registerNetworkCallback 成对出现
connectivityManager.addDefaultNetworkActiveListener(new ConnectivityManager.OnNetworkActiveListener() {
@Override public void onNetworkActive() {
Log.e(TAG, "Active ==>"); //无论是否成功链接外网,只要有一定量的数据传输就会间隔有回调
}
});
connectivityManager.requestNetwork(new NetworkRequest.Builder().build(), new ConnectivityManager.NetworkCallback() {
/**
* 网络可用的回调
* */
@Override
public void onAvailable(Network network) {
super.onAvailable(network);
Log.e("lzp", "onAvailable");
}
/**
* 网络丢失的回调
* */
@Override
public void onLost(Network network) {
super.onLost(network);
Log.e("lzp", "onLost");
}
/**
* 当建立网络连接时,回调连接的属性
* */
@Override
public void onLinkPropertiesChanged(Network network, LinkProperties linkProperties) {
super.onLinkPropertiesChanged(network, linkProperties);
Log.e("lzp", "onLinkPropertiesChanged");
}
/**
* 按照官方的字面意思是,当我们的网络的某个能力发生了变化回调,那么也就是说可能会回调多次
*
* 之后在仔细的研究
* */
@Override
public void onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities) {
super.onCapabilitiesChanged(network, networkCapabilities);
Log.e("lzp", "onCapabilitiesChanged");
}
/**
* 在网络失去连接的时候回调,但是如果是一个生硬的断开,他可能不回调
* */
@Override
public void onLosing(Network network, int maxMsToLive) {
super.onLosing(network, maxMsToLive);
Log.e("lzp", "onLosing");
}
/**
* 按照官方注释的解释,是指如果在超时时间内都没有找到可用的网络时进行回调
* */
@Override
public void onUnavailable() {
super.onUnavailable();
Log.e("lzp", "onUnavailable");
}
});