android对网络变化的更改

在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中对网络状态进行了升级:

官方说明:https://developer.android.google.cn/topic/performance/background-optimization.html#connectivity-action

如下图:

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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值