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

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

  • 首先,我们先新建一个类继承BroadcastReceiver
    IntentReceiver.kt主要代码
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    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函数中引用它
    1
    2
    3
    intentRecevier = IntentRecevier() // intentRecevier定义为全局变量
    var filter = IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)
    this.registerReceiver(intentRecevier,filter)
  • 记得在activity的onDestory函数中注销它,不然则可能导致已经注册的receiver 没有在合适的时机注销,导致内存泄漏,占用内存空间,加重 SystemService负担。
    1
    unregisterReceiver(intentRecevier)
    以上使用到的api需要申请权限,所以在AndroidManifect.xml添加
    1
    2
    3
    <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替代它。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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()

}

}
}

}