要想实现监听手机网络的连接情况,在断网时能够及时提醒用户,我们可以注册一个广播接收器,然后对手机网络变化进行实时监听。
- 首先,我们先新建一个类继承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()
}
}
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。