refactor(net): 完善网络监听

This commit is contained in:
Quyunshuo
2021-09-26 21:39:15 +08:00
parent 53f8dc90d1
commit cef6b97881
5 changed files with 92 additions and 18 deletions

View File

@ -9,6 +9,7 @@ import com.quyunshuo.androidbaseframemvvm.base.utils.EventBusRegister
import com.quyunshuo.androidbaseframemvvm.base.utils.EventBusUtils
import com.quyunshuo.androidbaseframemvvm.base.utils.network.AutoRegisterNetListener
import com.quyunshuo.androidbaseframemvvm.base.utils.network.NetworkStateChangeListener
import com.quyunshuo.androidbaseframemvvm.base.utils.network.NetworkTypeEnum
import com.quyunshuo.androidbaseframemvvm.base.utils.status.ViewStatusHelper
import com.quyunshuo.androidbaseframemvvm.base.utils.status.imp.BaseFrameViewStatusHelperImp
import com.quyunshuo.androidbaseframemvvm.base.utils.toast
@ -68,7 +69,7 @@ abstract class BaseFrameActivity<VB : ViewBinding, VM : BaseViewModel> : BaseFra
* @param type Int 网络类型
* @return Unit
*/
override fun networkTypeChange(type: Int) {}
override fun networkTypeChange(type: NetworkTypeEnum) {}
/**
* 网络连接状态更改回调

View File

@ -4,6 +4,7 @@ import android.net.ConnectivityManager
import android.net.Network
import android.net.NetworkCapabilities
/**
* 实时监听网络状态变化的[ConnectivityManager.NetworkCallback]实现类
*
@ -15,7 +16,7 @@ class NetworkCallbackImpl : ConnectivityManager.NetworkCallback() {
/**
* 当前网络类型
*/
var currentNetworkType = -1
var currentNetworkType: NetworkTypeEnum = NetworkTypeEnum.OTHER
/**
* 当前网络是否已连接
@ -42,18 +43,38 @@ class NetworkCallbackImpl : ConnectivityManager.NetworkCallback() {
override fun onCapabilitiesChanged(network: Network, networkCapabilities: NetworkCapabilities) {
super.onCapabilitiesChanged(network, networkCapabilities)
if (networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)) {
currentNetworkType = when {
networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> {
NetworkCapabilities.TRANSPORT_WIFI
}
networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> {
NetworkCapabilities.TRANSPORT_CELLULAR
}
else -> {
NetworkCapabilities.TRANSPORT_WIFI
}
}
currentNetworkType = networkTypeConvert(networkCapabilities)
changeCall?.networkTypeChange(currentNetworkType)
}
}
/**
* 网络类型转换
*/
private fun networkTypeConvert(networkCapabilities: NetworkCapabilities): NetworkTypeEnum {
return when {
networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> {
NetworkTypeEnum.TRANSPORT_CELLULAR
}
networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> {
NetworkTypeEnum.TRANSPORT_WIFI
}
networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_BLUETOOTH) -> {
NetworkTypeEnum.TRANSPORT_BLUETOOTH
}
networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) -> {
NetworkTypeEnum.TRANSPORT_ETHERNET
}
networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN) -> {
NetworkTypeEnum.TRANSPORT_VPN
}
networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI_AWARE) -> {
NetworkTypeEnum.TRANSPORT_WIFI_AWARE
}
networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_LOWPAN) -> {
NetworkTypeEnum.TRANSPORT_LOWPAN
}
else -> NetworkTypeEnum.OTHER
}
}
}

View File

@ -10,10 +10,10 @@ interface NetworkStateChangeListener {
/**
* 网络类型更改回调
* @param type Int 网络类型
* @param type NetworkTypeEnum 网络类型
* @return Unit
*/
fun networkTypeChange(type: Int)
fun networkTypeChange(type: NetworkTypeEnum)
/**
* 网络连接状态更改回调

View File

@ -47,10 +47,12 @@ object NetworkStateClient {
}
/**
* 获取网络类型 其他类型的网络归为了WIFI如果需要细分可以对[NetworkCallbackImpl]进行追加分类
* @return Int WIFI:[NetworkCapabilities.TRANSPORT_WIFI]、移动网络:[NetworkCapabilities.TRANSPORT_CELLULAR]
* 获取网络类型
* 当前网络类型是缓存的最近一次连接的网络类型,当无网络连接时其实拿到的是上一次的
* 所以网络是否连接应该作为第一判断,确定网络是连接状态时再获取当前的网络类型,因为网络类型中没有设定无网
* @return NetworkTypeEnum 参照[NetworkTypeEnum]
*/
fun getNetworkType(): Int = mNetworkCallback.currentNetworkType
fun getNetworkType(): NetworkTypeEnum = mNetworkCallback.currentNetworkType
/**
* 网络是否连接

View File

@ -0,0 +1,50 @@
package com.quyunshuo.androidbaseframemvvm.base.utils.network
/**
* 网络类型的枚举
*
* @author Qu Yunshuo
* @since 2021/8/22 10:35 下午
*/
enum class NetworkTypeEnum {
/**
* 使用蜂窝移动网络传输
*/
TRANSPORT_CELLULAR,
/**
* 使用Wi-Fi传输
*/
TRANSPORT_WIFI,
/**
* 使用蓝牙传输
*/
TRANSPORT_BLUETOOTH,
/**
* 使用以太网传输
*/
TRANSPORT_ETHERNET,
/**
* 使用 VPN 传输
*/
TRANSPORT_VPN,
/**
* 使用 Wi-Fi Aware 传输
*/
TRANSPORT_WIFI_AWARE,
/**
* 使用 LoWPAN 传输
*/
TRANSPORT_LOWPAN,
/**
* 其他
*/
OTHER
}