安卓(kotlin)实现实时监听网络变化

叻妮

要想实现监听手机网络的连接情况,在断网时能够及时提醒用户,我们可以注册一个广播接收器,然后对手机网络变化进行实时监听。

  • 首先,我们先新建一个类继承BroadcastReceiver

IntentReceiver.kt主要代码

class IntentRecevier() : BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent) {
        val manager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
        val networkInfo = manager.activeNetworkInfo

        // 判断网络情况
        if (networkInfo != null && networkInfo.isAvailable) {
            // 网络可用时的执行内容
        } else {
        // 网络不可用时的执行内容
            Toast.makeText(context, "network connect fail", Toast.LENGTH_SHORT).show()
            
        }
    }

}
  • 然后在activity文件的onCreate函数中引用它
intentRecevier = IntentRecevier() // intentRecevier定义为全局变量
var filter = IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)
this.registerReceiver(intentRecevier,filter)
  • 记得在activity的onDestory函数中注销它,不然则可能导致已经注册的

receiver 没有在合适的时机注销,导致内存泄漏,占用内存空间,加重 SystemService负担。

unregisterReceiver(intentRecevier)

以上使用到的api需要申请权限,所以在AndroidManifect.xml添加

<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"/>

自己可以根据实际的项目需求进行修改,包括向IntentRecevier传参,注册和注销所在的生命周期也可以视实际情况修改。


但是,使用以上代码的时候你会发现activeNetworkInfo在更高版本的api已经被弃用了,这时该肿么办。
我们现在需要使用ConnectivityManager.NetworkCallback API 或者 ConnectivityManager#getNetworkCapabilities 或者 ConnectivityManager#getLinkProperties替代它。

class IntentRecevier() : BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent) {
        val manager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
         if(Build.VERSION.SDK_INT<23){
            var networkInfo = manager.activeNetworkInfo
            if (networkInfo != null && networkInfo.isAvailable) {
                if (networkInfo.type == ConnectivityManager.TYPE_WIFI) {//WIFI
                    Toast.makeText(context, "sdk <23 wifi", Toast.LENGTH_SHORT).show()
                } else if (networkInfo.type == ConnectivityManager.TYPE_MOBILE) {//移动数据
                    Toast.makeText(context, "sdk <23 移动数据", Toast.LENGTH_SHORT).show()
                }
            }else{
                Toast.makeText(context, "sdk <23 无网络连接", Toast.LENGTH_SHORT).show()
            }
        }else{
            var network =manager.activeNetwork
            if(network!=null){
                var nc=manager.getNetworkCapabilities(network)
                if(nc!=null){
             if(nc.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)){//WIFI
                        Toast.makeText(context, "sdk >=23 wifi", Toast.LENGTH_SHORT).show()
                    }else if(nc.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)){//移动数据
                        Toast.makeText(context, "sdk >=23 移动数据", Toast.LENGTH_SHORT).show()
                    }
                }else{
                   
                }
            }else{
                Toast.makeText(context, "sdk >=23 无网络连接", Toast.LENGTH_SHORT).show()
               
            }

        }
    }

}
阅读 3.5k

在coding的海洋潜水

4 声望
2 粉丝
0 条评论

在coding的海洋潜水

4 声望
2 粉丝
文章目录
宣传栏