Android 监听网络状态的demo Kotlin

起因:

原本是打算监听一下网络中断状态的,但发现利用广播的方法弃用了,去官网查资料是推荐使用ConnectivityManager.NetworkCallback(),而且能监听的网络状态还挺多的。
另外官网上说是支持API 21的,但IDE警告是最低支持到API 24,而亲测API 31、API 30有效,也就是android11和android12的机子测试能够监听到。(后面有通过广播的方式监听的demo)

前期处理:

网络权限是必须的,在AndroidManifest.xml里添加权限


	<uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

操作代码

1、ConnectivityManager
2、调用registerDefaultNetworkCallback方法
3、然后像重写activity生命周期的方法一样重写NetworkCallback的onXXX方法,不需要的可以不写

class ConnectStateActivity : AppCompatActivity() {

    @RequiresApi(Build.VERSION_CODES.N)
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_connect_state)

        //获取管理器
        val connectivityManager =
            getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
        //注册
        connectivityManager.registerDefaultNetworkCallback(object :
            ConnectivityManager.NetworkCallback() {





			//以下是可以监听的状态




            /**
             * 当框架连接并声明一个新的网络可供使用时调用。
             *Called when the framework connects and
             * has declared a new network ready for use.
             */
            override fun onAvailable(network: Network) {
                super.onAvailable(network)
                Log.d(TAG, "onAvailable>>>>>start")
            }

            /**
             *当对指定网络的访问被阻止或解除阻止时调用。
             * Called when access to the specified
             * network is blocked or unblocked.
             */
            override fun onBlockedStatusChanged(network: Network, blocked: Boolean) {
                super.onBlockedStatusChanged(network, blocked)
                Log.d(TAG, "onBlockedStatusChanged>>>>>start")
            }

            /**
             * 当与此请求对应的网络更改功能但仍满足请求的条件时调用。
             * Called when the network corresponding to this
             * request changes capabilities but still satisfies the requested criteria.
             */
            override fun onCapabilitiesChanged(
                network: Network,
                networkCapabilities: NetworkCapabilities
            ) {
                super.onCapabilitiesChanged(network, networkCapabilities)
                Log.d(TAG, "onCapabilitiesChanged>>>>>start")

            }

            /**
             * 当该请求对应的网络发生变化时调用LinkProperties。
             * Called when the network corresponding
             * to this request changes LinkProperties.
             */
            override fun onLinkPropertiesChanged(network: Network, linkProperties: LinkProperties) {
                super.onLinkPropertiesChanged(network, linkProperties)
                Log.d(TAG, "onLinkPropertiesChanged>>>>>start")
            }

            /**
             * 当网络即将丢失时调用,通常是因为没有未完成的请求。
             * Called when the network is about to be lost,
             * typically because there are no outstanding requests left for it.
             */
            override fun onLosing(network: Network, maxMsToLive: Int) {
                super.onLosing(network, maxMsToLive)
                Log.d(TAG, "onLosing>>>>>start")
            }

            /**
             * 当网络断开连接或不再满足此请求或回调时调用。
             * Called when a network disconnects or otherwise
             * no longer satisfies this request or callback.
             */
            override fun onLost(network: Network) {
                super.onLost(network)
                Toast.makeText(this@ConnectStateActivity, "网络中断", Toast.LENGTH_SHORT).show()
                Log.d(TAG, "onReceive>>>>>网络中断")
            }

            /**
             * 如果在调用中指定的超时时间内没有找到网络,
             * 或者如果请求的网络请求无法完成(无论是否指定了超时),则调用。
             * Called if no network is found
             * within the timeout time specified in ConnectivityManager.
             * requestNetwork(android.net.NetworkRequest,
             * android.net.ConnectivityManager.NetworkCallback, int)
             * call or if the requested network request cannot
             * be fulfilled (whether or not a timeout was specified).
             *
             */
            override fun onUnavailable() {
                super.onUnavailable()
                Log.d(TAG, "onUnavailable>>>>>start")
            }
        })
    }
}

广播形式监听网络中断

同样也需要声明网络权限

class BroadcastReceiverActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
//        val binding = ActivityBroadcastReceiverBinding.inflate(layoutInflater)
//        setContentView(binding.root)
        setContentView(R.layout.activity_broadcast_receiver)

        //过滤器
        val intentFilter = IntentFilter()
        intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE")
        //注册监听
        registerReceiver(object : BroadcastReceiver(){
        	//监听到广播
            override fun onReceive(context: Context?, intent: Intent?) {
                val connectivityManager =
                    context?.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
                //网络中断了
                val activeNetwork = connectivityManager.activeNetworkInfo
                if (activeNetwork==null||!activeNetwork.isConnected){
                    Toast.makeText(context,"网络中断",Toast.LENGTH_SHORT).show()
                    Log.d(TAG,"onReceive>>>>>网络中断")
                }
            }
        },intentFilter)
    }

最后

官方推荐的方法底层没具体看过,粗浅猜测也是用广播的形式监听然后封装的,不一定对,有知道的朋友请告诉我一声。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是 Kotlin 代码示例,用于检测 WiFi 连接状态的更改: ```kotlin import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import android.net.ConnectivityManager import android.net.NetworkCapabilities import android.net.NetworkInfo import android.net.NetworkRequest import android.net.wifi.WifiInfo import android.net.wifi.WifiManager import android.os.Build import android.util.Log class WifiStateReceiver : BroadcastReceiver() { private var wifiManager: WifiManager? = null private var connectivityManager: ConnectivityManager? = null private var networkCallback: ConnectivityManager.NetworkCallback? = null override fun onReceive(context: Context, intent: Intent) { wifiManager = context.getSystemService(Context.WIFI_SERVICE) as WifiManager connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager if (wifiManager?.isWifiEnabled == true) { Log.d(TAG, "WiFi is enabled.") if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { networkCallback = object : ConnectivityManager.NetworkCallback() { override fun onAvailable(network: android.net.Network) { super.onAvailable(network) Log.d(TAG, "WiFi is connected.") } override fun onLost(network: android.net.Network) { super.onLost(network) Log.d(TAG, "WiFi is disconnected.") } } val builder = NetworkRequest.Builder() .addTransportType(NetworkCapabilities.TRANSPORT_WIFI) connectivityManager?.registerNetworkCallback(builder.build(), networkCallback!!) } else { context.registerReceiver(this, IntentFilter(WifiManager.NETWORK_STATE_CHANGED_ACTION)) } } else { Log.d(TAG, "WiFi is disabled.") } } companion object { private const val TAG = "WifiStateReceiver" } } ``` 在 `onReceive()` 方法中,我们检查 WiFi 是否已启用。如果是,则根据设备的 Android 版本注册网络回调或广播接收器以监听网络状态更改。 如果 Android 版本大于或等于 N,我们将创建一个 `NetworkRequest` 并将其传递给 `registerNetworkCallback()` 方法以注册网络回调。在回调中,我们将检查网络是否可用,并相应地记录连接或断开连接的状态。 如果 Android 版本低于 N,则我们将注册一个广播接收器以侦听 `WifiManager.NETWORK_STATE_CHANGED_ACTION` 意图。在接收器中,我们将检查网络信息是否可用,并相应地记录连接或断开连接的状态

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值