Android开发 ConnectivityManager

前言

  ConnectivityManager类用于查询网络状态,并且也能被动监听网络状态的变化。

判断是否有网络

下面这个getActiveNetworkInfo 方法是过时的旧方法。这里记录一下,请注意如果获取到的是null,那么等于当前设备没有连接网络。注意这里是使用kotlin代码调用的(个人最近在切换到kotlin)

    private fun hasNetwork(): Boolean {
        val connectivity = getSystemService(CONNECTIVITY_SERVICE) as ConnectivityManager
        val networkInfo = connectivity.activeNetworkInfo
        return networkInfo != null && networkInfo.isAvailable //networkInfo如果是null也是没有网络
    }

新方法请使用getActiveNetwork,,同上如果获取到的是null,那么等于当前设备没有连接网络

    private fun hasNetwork2(): Boolean {
        var connectivityManager: ConnectivityManager = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
            val network = connectivityManager.activeNetwork
            return network != null //如果是null代表没有网络
        }
        return false
    }

判断当前网络类型

        val cm = applicationContext.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
        val networks = cm.allNetworks
        for (item in networks){
            val caps = cm.getNetworkCapabilities(item)
            if (caps.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)){
                Log.e("ytzn", "item wifi 网络")

            } else if (caps.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)){
                Log.e("ytzn", "item wifi 移动网络")
            }
        }

监听网络状态

如果你的需求只是关注是否有网络,你只需要关心 onAvailable回调(有网络时回调) 与 onLost回调(无网络时回调)

private void networkListener() {
        ConnectivityManager connectivity = (ConnectivityManager) getContext().getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkRequest.Builder builder = new NetworkRequest.Builder();
        NetworkRequest request = builder.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
                .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)    //表示此网络使用Wi-Fi传输
                .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)//表示此网络使用蜂窝传输
                .build();
        connectivity.registerNetworkCallback(request, new ConnectivityManager.NetworkCallback() {
            @Override
            public void onAvailable(Network network) {
                super.onAvailable(network);
                //网络可用
                ToastUtils.showShortToast("网络可用");
                Log.e("调试_临时_log", "this_onAvailable");

            }

            @Override
            public void onUnavailable() {
                super.onUnavailable();
                //如果在指定的超时时间内未找到网络,则调用
                Log.e("调试_临时_log", "this_onUnavailable");
            }

            @Override
            public void onLost(@NonNull Network network) {
                super.onLost(network);
                //当框架的网络严重中断或正常故障结束时调用
                Log.e("调试_临时_log", "this_onLost");
            }

            @Override
            public void onBlockedStatusChanged(@NonNull Network network, boolean blocked) {
                super.onBlockedStatusChanged(network, blocked);
                //当对指定网络的访问被阻止或取消阻止时调用
                Log.e("调试_临时_log", "this_onBlockedStatusChanged");
            }

            @Override
            public void onCapabilitiesChanged(@NonNull Network network, @NonNull NetworkCapabilities networkCapabilities) {
                super.onCapabilitiesChanged(network, networkCapabilities);
                //当网络连接到此请求的框架*更改功能但仍满足规定的需求时调用。
                boolean isInternet = networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);//获取是否能连接Internet网
                Log.e("调试_临时_log", "this_onCapabilitiesChanged : isInternet = " + isInternet);
            }

            @Override
            public void onLosing(@NonNull Network network, int maxMsToLive) {
                super.onLosing(network, maxMsToLive);
                //当网络即将断开时调用。通常与新替换网络的呼叫配对,
                //以实现优雅的切换。如果我们有严重损失*(损失而没有警告),则可能无法调用此方法。
                Log.e("调试_临时_log", "this_onLosing");
            }

            @Override
            public void onLinkPropertiesChanged(@NonNull Network network, @NonNull LinkProperties linkProperties) {
                super.onLinkPropertiesChanged(network, linkProperties);
                //当与该请求连接的框架网络更改时调用。
                Log.e("调试_临时_log", "this_onLinkPropertiesChanged");
            }
        });
    }

另外你可以在配置的时候addTransportType指定监听某个网络状态比如WiFi或者移动网络,NetworkCapabilities类里还有更多类型:

    /**
     * 表示此网络使用移动蜂窝传输。
     */
    public static final int TRANSPORT_CELLULAR = 0;

    /**
     *表示此网络使用Wi-Fi传输。
     */
    public static final int TRANSPORT_WIFI = 1;

    /**
     * 表示此网络使用蓝牙传输
     */
    public static final int TRANSPORT_BLUETOOTH = 2;

    /**
     * 表示此网络使用以太网传输。
     */
    public static final int TRANSPORT_ETHERNET = 3;

    /**
     * 指示此网络使用VPN传输。
     */
    public static final int TRANSPORT_VPN = 4;

    /**
     * 表示此网络使用支持 Wi-Fi Aware 的传输。
     */
    public static final int TRANSPORT_WIFI_AWARE = 5;

    /**
     * 表示此网络使用低功耗传输。
     */
    public static final int TRANSPORT_LOWPAN = 6;

 End

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值