Android 网络监听

Android 11以后关于网络监听处理

Android 11以后关于网络监听处理

随着权限和隐私的的进一步严格,网络监听也做了修改,以前获取网络状态的api已经标注为Deprecated,即以前通过广播监听方式已经标记废弃,因此来一起看看新的网络监听api以及监听逻辑;

	/**
	*Deprecated
apps should use the more versatile requestNetwork, registerNetworkCallback or registerDefaultNetworkCallback functions instead for faster and more detailed updates about the network changes they care about.
	*/
  	@Deprecated
    public static final String CONNECTIVITY_ACTION = "android.net.conn.CONNECTIVITY_CHANGE";

上面讲述了该api已经废弃,并推荐开发者使用新的api去处理。

NetworkCallback

新的网络监听主要通过向ConnectivityManager注册NetworkCallback网络变化,其可以监听可用网络,网络丢失,网络丢包情况,主要api如下:

  1. onAvailable(network: Network); //有可用网络情况调用;
  2. onLost(network: Network) ; //可用网络丢失
  3. onLosing(network: Network, maxMsToLive: Int) ; //丢包情况

其他的:

  • onCapabilitiesChanged(network: Network, networkCapabilities: NetworkCapabilities);//网络能力变化
  • onLinkPropertiesChanged(network: Network, linkProperties: LinkProperties) //网络属性变化

简单的使用

        val connectivityManager = getSystemService(ConnectivityManager::class.java)
connectivityManager.registerDefaultNetworkCallback(object :
            ConnectivityManager.NetworkCallback() {
            override fun onAvailable(network: Network) {
                val networkCapabilities = connectivityManager.getNetworkCapabilities(network)
                val properties = connectivityManager.getLinkProperties(network)
                val preference = connectivityManager.getMultipathPreference(network)
                Log.e(
                    TAG,
                    "The default network is now: $network capabilities:$networkCapabilities properties:$properties preference:$preference"
                )
            }

            override fun onLost(network: Network) {
                Log.e(
                    TAG,
                    "The application no longer has a default network. The last default network was $network"
                )
            }

            override fun onLosing(network: Network, maxMsToLive: Int) {
                super.onLosing(network, maxMsToLive)
            }

            override fun onCapabilitiesChanged(network: Network, networkCapabilities: NetworkCapabilities) {
                if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
                    val wifiInfo = networkCapabilities.transportInfo as WifiInfo
                }
                if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {

                }
                Log.e(TAG, "The default network changed capabilities: $networkCapabilities")
            }

            override fun onLinkPropertiesChanged(network: Network, linkProperties: LinkProperties) {
                Log.e(TAG, "The default network changed link properties: $linkProperties")
            }
        })

上面代码监听所有网络变化情况,如果关注特定网络变化,可以通过NetworkRequest构建需要监听的网络:

     val request = NetworkRequest.Builder()
            .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
            .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
            .build()
        connectivityManager.registerNetworkCallback(
            request,
            object : ConnectivityManager.NetworkCallback() {
                override fun onAvailable(network: Network) {
                    Log.e(TAG, "The default network is now: $network")
                }

                override fun onLost(network: Network) {
                    Log.e(
                        TAG,
                        "The application no longer has a default network. The last default network was $network"
                    )
                }

                override fun onCapabilitiesChanged(
                    network: Network,
                    networkCapabilities: NetworkCapabilities
                ) {
                    Log.e(TAG, "The default network changed capabilities: $networkCapabilities")
                }

                override fun onLinkPropertiesChanged(
                    network: Network,
                    linkProperties: LinkProperties
                ) {
                    Log.e(TAG, "The default network changed link properties: $linkProperties")
                }
            })

通过上面代码可以看到,在获得可用网络时,api给到的只有一个network实例,如果我们需要获取更具体信息,可以通过getNetworkCapabilities等api进一步了解具体详情:如网络能力、网络属性和偏好等。
如 val networkCapabilities = connectivityManager.getNetworkCapabilities(network),输出结果如下:

[ Transports: WIFI Capabilities: NOT_METERED&INTERNET&NOT_RESTRICTED&TRUSTED&NOT_VPN&VALIDATED&NOT_ROAMING&FOREGROUND&NOT_CONGESTED&NOT_SUSPENDED&NOT_VCN_MANAGED LinkUpBandwidth>=12000Kbps LinkDnBandwidth>=60000Kbps TransportInfo: <SSID: <unknown ssid>, BSSID: 02:00:00:00:00:00, MAC: 02:00:00:00:00:00, IP: /10.1.206.45, Security type: 2, Supplicant state: COMPLETED, Wi-Fi standard: 5, RSSI: -51, Link speed: 234Mbps, Tx Link speed: 234Mbps, Max Supported Tx Link speed: 433Mbps, Rx Link speed: 263Mbps, Max Supported Rx Link speed: 433Mbps, Frequency: 5260MHz, Net ID: -1, Metered hint: false, score: 60, isUsable: true, CarrierMerged: false, SubscriptionId: -1, IsPrimary: -1, Trusted: true, Restricted: false, Ephemeral: false, OEM paid: false, OEM private: false, OSU AP: false, FQDN: <none>, Provider friendly name: <none>, Requesting package name: <none><none>MLO Information: , AP MLD Address: <none>, AP MLO Link Id: <none>, AP MLO Affiliated links: <none>> SignalStrength: -51 UnderlyingNetworks: Null] 

描述似乎是关于设备的WiFi连接的技术详细信息,包括链接速度、信号强度和安全类型。这些信息可以用于诊断连接问题或确定其是否适合某些任务。一些关键点包括:
SSID(网络名称)未知。
BSSID(接入点的MAC地址)为02:00:00:00:00:00。
设备的IP地址为10.1.206.45。
安全类型为WPA2(2)。
信号强度为-64 dBm。
链接速度为234 Mbps,最大支持速度为433 Mbps。
它还提到该连接被认为是“可信”的、“不受限制的”且具有高带宽,表明它应该适用于大多数在线活动。
至于properties、preference我们可以看具体输出。

以上是关于网络变化的监听,如果我们仅仅只要当前的网络情况我们可以:

val currentNetwork = connectivityManager.activeNetwork
// 这里前期是currentNetwork 不为空,如果网络不可用为空;有网络的时候非空,才能继续下面步骤
val networkCapabilities = connectivityManager.getNetworkCapabilities(currentNetwork )
val properties = connectivityManager.getLinkProperties(currentNetwork )
val preference = connectivityManager.getMultipathPreference(currentNetwork )
if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
	val wifiInfo = networkCapabilities.transportInfo as WifiInfo
}
if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
//
}

以上是获取当前可用网络,以及进一步判断当前网络信息等。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Android提供了一个ConnectivityManager类来监听网络状态的变化。ConnectivityManager类可以通过注册BroadcastReceiver来实现网络状态的监听,也可以通过调用该类的方法来获取当前网络状态。 以下是通过注册BroadcastReceiver来监听网络状态的代码示例: 1. 创建一个BroadcastReceiver类 ``` public class NetworkChangeReceiver 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.isConnected()) { // 网络已连接 } else { // 网络未连接 } } } ``` 2. 在AndroidManifest.xml文件中注册BroadcastReceiver ``` <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <application ... <receiver android:name=".NetworkChangeReceiver"> <intent-filter> <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> <action android:name="android.net.wifi.WIFI_STATE_CHANGED" /> </intent-filter> </receiver> ... </application> ``` 在上面的代码中,我们注册了两个IntentFilter,一个是CONNECTIVITY_CHANGE,另一个是WIFI_STATE_CHANGED。这样,当网络状态发生变化时,系统会发送一个广播,我们的BroadcastReceiver就会接收到这个广播,并在onReceive方法中处理。 通过调用ConnectivityManager类的方法来获取当前网络状态的代码示例: ``` ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); if (networkInfo != null && networkInfo.isConnected()) { // 网络已连接 } else { // 网络未连接 } ``` 在上面的代码中,我们通过调用ConnectivityManager类的getActiveNetworkInfo方法来获取当前网络状态。如果返回的networkInfo对象不为空,并且isConnected方法返回true,那么就表示当前网络已连接。否则,就表示当前网络未连接。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值