我们使用Android ConnectivityManager
来监听应用内的互联网连接更改,如下所示。
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
...
ConnectionStateMonitor().enable(this)
}
class ConnectionStateMonitor : NetworkCallback() {
private val networkRequest: NetworkRequest = NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI).build()
fun enable(context: Context) {
val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
connectivityManager.registerNetworkCallback(networkRequest, this)
}
override fun onAvailable(network: Network) {
Log.i(TAG, "onAvailable ")
}
override fun onLost(network: Network?) {
super.onLost(network)
Log.i(TAG, "onLost ")
}
}
}
除了我们遇到的两个问题之外,此实施效果很好
如果我们同时使用wifi和移动数据连接到Internet并关闭wifi,则有时会触发onLost()
回调,然后触发onAvailable()
,但在其他情况下仅 onLost()
被触发,这是不正确的。
如果没有Internet连接并打开应用程序onLost()
,则不会触发,但是如果我们有Internet连接并打开应用程序onAvailable()
,则会触发。
任何帮助,建议,变通办法或其他可靠地检测Internet连接更改的方法,将不胜感激。
在Xioami A2(Android 9),OnePlus(Android 9)上进行了测试
DEMO项目
https://github.com/PhanVanLinh/AndroidNetworkChangeReceiver
答案 0 :(得分:1)
AndroidManifest上的广播接收器定义有所更改。您可以在here上找到适当的描述。
您已经用这种方法实现了,但是无论如何,我想添加Network callback class references作为参考点。
答案 1 :(得分:1)
我已经使用了您的项目,并添加了另一种方法:onCapabilitiesChanged
。我开始使用可行的飞行模式,然后关闭然后再次打开。这些是日志:
onAvailable 632
onCapabilitiesChanged 632 [运输:细胞...]
onAvailable 632
onCapabilitiesChanged 632 [运输:细胞...]
onAvailable 632
onCapabilitiesChanged 632 [运输:细胞...]
onCapabilitiesChanged 632 [运输:细胞...]
onCapabilitiesChanged 632 [运输:细胞...]
onAvailable 633
onCapabilitiesChanged 633 [传输:WIFI ...] onAvailable 633 onCapabilitiesChanged 633 [运输:WIFI ...]
onAvailable 633
onCapabilitiesChanged 633 [运输:WIFI ...]
onCapabilitiesChanged 633 [运输:WIFI ...]
onCapabilitiesChanged 633 [运输:WIFI ...]
onCapabilitiesChanged 633 [运输:WIFI ...]
onCapabilitiesChanged 633 [运输:WIFI ...]
onCapabilitiesChanged 633 [运输:WIFI ...]
onLost 632
onLost 632
onLost 632
onLost 633
onLost 633
onLost 633
onAvailable 634
onCapabilitiesChanged 634 [运输:细胞...]
onAvailable 634
onCapabilitiesChanged 634 [运输:细胞...]
onAvailable 634
onCapabilitiesChanged 634 [运输:细胞...]
onCapabilitiesChanged 634 [运输:细胞...]
onCapabilitiesChanged 634 [运输:细胞...]
onCapabilitiesChanged 634 [运输:细胞...]
onAvailable 635
onCapabilitiesChanged 635 [传输:WIFI ...]
onAvailable 635
onCapabilitiesChanged 635 [传输:WIFI ...]
onAvailable 635
onCapabilitiesChanged 635 [传输:WIFI ...]
onCapabilitiesChanged 635 [传输:WIFI ...]
onCapabilitiesChanged 635 [传输:WIFI ...]
onCapabilitiesChanged 635 [传输:WIFI ...]
onLost 634
onLost 634
onLost 634
onCapabilitiesChanged 635 [传输:WIFI ...]
onCapabilitiesChanged 635 [传输:WIFI ...]
您可以看到LOST
用于蜂窝传输,而AVAILABLE
用于WiFi
按照您的用例(启用wifi,启用mobiledata,禁用wifi数据,启用wifi,禁用wifi),这就是我所得到的。
onAvailable 640
onCapabilities更改为640 [传输:WIFI ...]
onAvailable 640
onCapabilities更改为640 [传输:WIFI ...]
onCapabilities更改为640 [传输:WIFI ...]
onCapabilities更改为640 [传输:WIFI ...]
onCapabilities更改为640 [传输:WIFI ...]
onCapabilities更改为640 [传输:WIFI ...]
onLost 640
onLost 640
onAvailable 641
onCapabilitiesChanged 641 [运输:细胞...]
onAvailable 641
onCapabilitiesChanged 641 [运输:细胞...]
onCapabilitiesChanged 641 [运输:细胞...]
onCapabilitiesChanged 641 [运输:细胞...]
onAvailable 642
onCapabilitiesChanged 642 [运输:WIFI ...]
onAvailable 642
onCapabilitiesChanged 642 [运输:WIFI ...]
onCapabilitiesChanged 642 [运输:WIFI ...]
onCapabilitiesChanged 642 [运输:WIFI ...]
onCapabilitiesChanged 642 [运输:WIFI ...]
onCapabilitiesChanged 642 [运输:WIFI ...]
onLost 641
onLost 641
onLost 642
onLost 642
onAvailable 643
onCapabilitiesChanged 643 [运输:细胞...]
onAvailable 643
onCapabilitiesChanged 643 [运输:细胞...]
onCapabilitiesChanged 643 [运输:细胞...]
onCapabilitiesChanged 643 [运输:细胞...]
答案 2 :(得分:1)
也许您可以尝试使用requestNetwork
而不是registerNetworkCallback
。