在 Android 上无限期地监听网络状态变化的"appropriate"方法是什么?



我正在开发一个Android应用程序,该应用程序在后台监控设备的网络使用情况。据我所知,几年前,常用的方法是注册一个BroadcastReceiver,它可以捕获每个CONNECTIVITY_CHANGE事件,但它似乎在Android 7中被弃用了。我可以看到一个名为JobScheduler的类从那时起就被引入作为一种替代,但我不确定它是否适合这个特定的用例。

使用ConnectivityManager类来侦听连接更改。

来自官方文件

类,用于回答有关网络连接状态的查询。它还将在网络连接更改时通知应用程序。

使用registerNetworkCallback接收关于满足给定NetworkRequest的所有网络的通知

以下是Kotlin中的示例代码:

enum class NetworkResult {
CONNECTED,
DISCONNECTED,
DISCONNECTING
}

class NetworkCallback : ConnectivityManager.NetworkCallback(){
val result = MutableLiveData<NetworkResult>()
override fun onCapabilitiesChanged(network: Network, networkCapabilities: NetworkCapabilities) {
super.onCapabilitiesChanged(network, networkCapabilities)
}
override fun onLost(network: Network) {
Timber.i("onLost networkL $network")
result.postValue(NetworkResult.DISCONNECTED)
}
override fun onLosing(network: Network, maxMsToLive: Int) {
Timber.i("onLosing: network: $network maxMsToLive: $maxMsToLive")
result.postValue(NetworkResult.DISCONNECTING)
}
override fun onAvailable(network: Network) {
Timber.i("onAvailable: network: $network")
result.postValue(NetworkResult.CONNECTED)
}
}

class ConnectivityFactory {
fun internetRequest() : NetworkRequest{
return NetworkRequest.Builder()
.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)
.build()
}
}

class NetworkConnectionManager(val context: Context){
private val factory : ConnectivityFactory = ConnectivityFactory()
private val callback : NetworkCallback = NetworkCallback()
private val connectivityManager = context.getSystemService(CONNECTIVITY_SERVICE) as ConnectivityManager
val result : LiveData<NetworkResult>  get() = callback.result
fun registerCallback(){
val request = factory.internetRequest()
connectivityManager.registerNetworkCallback(request, callback)
}
fun unregisterCallback(){
connectivityManager.unregisterNetworkCallback(callback)
}
}

用法:

val networkManager : NetworkConnectionManager by lazy { NetworkConnectionManager(this)  } 
// observer state 
networkManager.result.observe(this, Observer {
Timber.i(it.name)
})

// register 
networkManager.registerCallback()()
// unregister 
networkManager.unregisterCallback()

最新更新