android对网络变化的更改
在android5之前的版本中一直如下操作新建BroadcastReceiver新建NetworReceiver,继承BroadcastReceiver,在onReceive()方法中,首先通过getSystemService()方法得到了ConnectivityManager的实例,这是一个系统服务类,专门用于管理网络连接的。然后调用它的getActiveNetworkInfo()方法...
在android5之前的版本中一直如下操作
新建BroadcastReceiver
新建NetworReceiver,继承BroadcastReceiver,在onReceive()方法中,首先通过getSystemService()方法得到了ConnectivityManager的实例,这是一个系统服务类,专门用于管理网络连接的。然后调用它的getActiveNetworkInfo()方法可以得到NetworkInfo的实例,接着调用NetworkInfo的isAvailable()方法就可以判断出当前是否有网络了。
public class NetworkReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// 判断网络是否可用
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.isAvailable()) {
// 网络可用
}else{
// 网络不可用
}
}
注册BroadcastReceiver
注册BroadcastReceiver分为动态注册和静态注册
在Activity onCreate方法注册,在onDestory方法注销。
private NetworkReceiver mNetworkReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// create IntentFilter
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
mNetworkReceiver = new NetworkReceiver();
// register network
registerReceiver(mNetworkReceiver, intentFilter);
}
@Override
protected void onDestroy() {
super.onDestroy();
// unregister network
unregisterReceiver(mNetworkReceiver);
}
静态注册(android7以上已经不支持这种方式了,这样做不会起到效果)
在注册文件AndroidManifest.xml中,注册NetworkReceiver。
<receiver android:name=".receiver.NetworkReceiver">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
</intent-filter>
</receiver>
网路类型
@Override
public void onReceive(Context context, Intent intent) {
// 判断网络是否可用
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.isAvailable()) {
// 网络可用
switch (networkInfo.getType()) {
case ConnectivityManager.TYPE_MOBILE:
// 手机流量
break;
case ConnectivityManager.TYPE_WIFI:
// wifi
break;
default:
break;
}
}
需要申请的权限
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
但是在高版本的android中对网络状态进行了升级:
如下图:
android高版本中的使用
第一种:使用代码中动态注册的方式 还是可以使用,但是会提示
ConnectivityManager.CONNECTIVITY_ACTION 已过时的提示
第二种:这种就是在高版本方式中添加的功能
这个是android5.0 sdk 21新添加的API,使用方法如下
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
ConnectivityManager manager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
manager.requestNetwork(new NetworkRequest.Builder().build(),
new ConnectivityManager.NetworkCallback() {
@Override
public void onAvailable(Network network) {
super.onAvailable(network);
Log.i("aaa", "监听,网络可用");
}
@Override
public void onLost(Network network) {
super.onLost(network);
Log.i("aaa", "监听,网络断开");
}
});
}
使用registerDefaultNetworkCallback
这个是android7.0 SDK 24添加的API,使用方法如下
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
ConnectivityManager manager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
manager.registerDefaultNetworkCallback(new ConnectivityManager.NetworkCallback() {
@Override
public void onLost(Network network) {
super.onLost(network);
Log.i("aaa", "注册,网络可用");
}
@Override
public void onAvailable(Network network) {
super.onAvailable(network);
Log.i("aaa", "注册,网络可用");
}
取消监听
不管使用requestNetwork方式,还是registerDefaultNetworkCallback方式,取消监听的方式是相同的,使用unregisterNetworkCallback方法,
ConnectivityManager manager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
manager.unregisterNetworkCallback(new ConnectivityManager.NetworkCallback());
注意
这些API需要申请网络权限,在注册文件添加权限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
结论:
最后对于兼容性:
1、可以通过动态注册 BroadcastReceiver 继续使用。
2、也可以判断 API 24(N) 以上用 NetworkCallback, 低版本用 BroadcastReceiver。
转载别处博客,并有所修改
原文链接:https://blog.csdn.net/JunquanChen/article/details/86527361
更多推荐
所有评论(0)