Android NetworkCallback

本文介绍了Android API28中推荐使用NetworkCallback替代过时的网络状态监听方法,详细解析了NetworkCallback的用法,包括网络连接、功能变化、属性修改等通知,并提供了示例代码。同时,文章讨论了如何针对不同API版本进行差异化处理,以及检查网络连接、WiFi和移动网络状态的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android API28对于网络状态的改变更倾向使用NetworkCallback

底下是一段对于过时方法的官方描述

getState()

This method was deprecated in API level 28. Apps should instead use theConnectivityManager.NetworkCallback API to learn about connectivity changes.ConnectivityManager.registerDefaultNetworkCallback(ConnectivityManager.NetworkCallback) andConnectivityManager.registerNetworkCallback(NetworkRequest, PendingIntent). These will give a more accurate picture of the connectivity state of the device and let apps react more easily and quickly to changes.

 

ConnectivityManager.NetworkCallbackadded 

Base class for NetworkRequest callbacks. Used for notifications about network changes. Should be extended by applications wanting notifications. 

示例代码

        ConnectivityManager connectivityManager=(ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            connectivityManager.registerDefaultNetworkCallback(new ConnectivityManager.NetworkCallback(){
                @Override
                public void onAvailable(Network network) {
                    super.onAvailable(network);
                    Log.i(TAG, "onAvailable: "+network);
                }

                @Override
                public void onLosing(Network network, int maxMsToLive) {
                    super.onLosing(network, maxMsToLive);
                    Log.i(TAG, "onLosing: "+network);
                }

                @Override
                public void onLost(Network network) {
                    super.onLost(network);
                    Log.i(TAG, "onLost: "+network);
                }

                @Override
                public void onUnavailable() {
                    super.onUnavailable();
                    Log.i(TAG, "onUnavailable: ");
                }

                @Override
                public void onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities) {
                    super.onCapabilitiesChanged(network, networkCapabilities);
                    Log.i(TAG, "onCapabilitiesChanged: "+network);
                }

                @Override
                public void onLinkPropertiesChanged(Network network, LinkProperties linkProperties) {
                    super.onLinkPropertiesChanged(network, linkProperties);
                    Log.i(TAG, "onLinkPropertiesChanged: "+network);
                }
            });
        }

Public methods

voidonAvailable(Network network)

Called when the framework connects and has declared a new network ready for use.

voidonCapabilitiesChanged(Network network, NetworkCapabilitiesnetworkCapabilities)

Called when the network the framework connected to for this request changes capabilities but still satisfies the stated need.

voidonLinkPropertiesChanged(Network network, LinkProperties linkProperties)

Called when the network the framework connected to for this request changes LinkProperties.

voidonLosing(Network network, int maxMsToLive)

Called when the network is about to be disconnected.

voidonLost(Network network)

Called when the framework has a hard loss of the network or when the graceful failure ends.

voidonUnavailable()

Called if no network is found in the timeout time specified inConnectivityManager.requestNetwork(NetworkRequest, NetworkCallback, int)call.

从上到下分别是:

网络连接时调用

网络功能更改但任满足需求时调用

网络连接属性修改时调用

网络即将断开时调用

网络断开时调用

网络缺失network时调用

 

registerDefaultNetworkCallback

added in API level 26

ConnectivityManager.NetworkCallback

added in API level 21

所以要针对高版本和低版本做差异化

 

网络是否连接

    public  boolean isNetworkAvailable(Context context) {
        ConnectivityManager mgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo[] infos = mgr.getAllNetworkInfo();
        if (infos != null) {
            for (int i = 0; i < infos.length; i++) {
                if (infos[i].isConnected() == true) {
                    return true;
                }
            }
        }
        return false;
    }

WiFi是否连接

    public static boolean isWifiConnected(Context context) {
        ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo mWiFiNetworkInfo = mConnectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
        if (mWiFiNetworkInfo != null) {
            return mWiFiNetworkInfo.isConnected();
        }
        return false;
    }

移动网络是否连接

    public static boolean isMobleConnected(Context context) {
        ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo mMobleNetworkInfo = mConnectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
        if (mMobleNetworkInfo != null) {
            return mMobleNetworkInfo.isConnected();
        }
        return false;
    }

获取当前连接网络类型

    public void  getType(Context context) {
        ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
        if (networkInfo!=null){
            Log.i(TAG, "yyy-type: "+networkInfo.isAvailable()+" "+networkInfo.isConnected()+" "+networkInfo.toString());
            Log.i(TAG, "yyy-type: "+networkInfo.getSubtypeName()+" "+networkInfo.getTypeName()+" "+networkInfo.getExtraInfo());
        }
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值