在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
 

 

 

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐