- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我们使用 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 和移动数据连接到互联网并关闭 wifi,有时会触发 onLost()
回调,然后触发 onAvailable()
,正如预期的那样,但在其他情况下,仅 onLost()
被触发,这是不正确的。
如果我们没有互联网连接并打开应用程序,onLost()
不会被触发,但是如果我们有互联网连接并打开应用程序,onAvailable()
被解雇。
任何帮助、建议、解决方法或其他可靠检测互联网连接变化的方法都将不胜感激。
在小米 A2 (Android 9), OnePlus (Android 9) 上测试
演示项目
https://github.com/PhanVanLinh/AndroidNetworkChangeReceiver
最佳答案
我已经使用了您的项目并添加了另一个方法:onCapabilitiesChanged
。我从启用飞行模式开始,然后关闭然后再次打开。这些是日志:
onAvailable 632
onCapabilitiesChanged 632 [ Transports: CELLULAR ...]
onAvailable 632
onCapabilitiesChanged 632 [ Transports: CELLULAR ...]
onAvailable 632
onCapabilitiesChanged 632 [ Transports: CELLULAR ...]
onCapabilitiesChanged 632 [ Transports: CELLULAR ...]
onCapabilitiesChanged 632 [ Transports: CELLULAR ...]
onAvailable 633
onCapabilitiesChanged 633 [ Transports: WIFI ...] onAvailable 633 onCapabilitiesChanged 633 [ Transports: WIFI ...]
onAvailable 633
onCapabilitiesChanged 633 [ Transports: WIFI ...]
onCapabilitiesChanged 633 [ Transports: WIFI ...]
onCapabilitiesChanged 633 [ Transports: WIFI ...]
onCapabilitiesChanged 633 [ Transports: WIFI ...]
onCapabilitiesChanged 633 [ Transports: WIFI ...]
onCapabilitiesChanged 633 [ Transports: WIFI ...]
onLost 632
onLost 632
onLost 632
onLost 633
onLost 633
onLost 633
onAvailable 634
onCapabilitiesChanged 634 [ Transports: CELLULAR ...]
onAvailable 634
onCapabilitiesChanged 634 [ Transports: CELLULAR ...]
onAvailable 634
onCapabilitiesChanged 634 [ Transports: CELLULAR ...]
onCapabilitiesChanged 634 [ Transports: CELLULAR ...]
onCapabilitiesChanged 634 [ Transports: CELLULAR ...]
onCapabilitiesChanged 634 [ Transports: CELLULAR ...]
onAvailable 635
onCapabilitiesChanged 635 [ Transports: WIFI ...]
onAvailable 635
onCapabilitiesChanged 635 [ Transports: WIFI ...]
onAvailable 635
onCapabilitiesChanged 635 [ Transports: WIFI ...]
onCapabilitiesChanged 635 [ Transports: WIFI ...]
onCapabilitiesChanged 635 [ Transports: WIFI ...]
onCapabilitiesChanged 635 [ Transports: WIFI ...]
onLost 634
onLost 634
onLost 634
onCapabilitiesChanged 635 [ Transports: WIFI ...]
onCapabilitiesChanged 635 [ Transports: WIFI ...]
如您所见,LOST
用于蜂窝传输,而 AVAILABLE
用于 WiFi
根据您的用例(启用 wifi、启用移动数据、禁用 wifi 数据、启用 wifi、禁用 wifi)这就是我得到的。
onAvailable 640
onCapabilitiesChanged 640 [ Transports: WIFI ... ]
onAvailable 640
onCapabilitiesChanged 640 [ Transports: WIFI ... ]
onCapabilitiesChanged 640 [ Transports: WIFI ... ]
onCapabilitiesChanged 640 [ Transports: WIFI ... ]
onCapabilitiesChanged 640 [ Transports: WIFI ... ]
onCapabilitiesChanged 640 [ Transports: WIFI ... ]
onLost 640
onLost 640
onAvailable 641
onCapabilitiesChanged 641 [ Transports: CELLULAR ... ]
onAvailable 641
onCapabilitiesChanged 641 [ Transports: CELLULAR ... ]
onCapabilitiesChanged 641 [ Transports: CELLULAR ... ]
onCapabilitiesChanged 641 [ Transports: CELLULAR ... ]
onAvailable 642
onCapabilitiesChanged 642 [ Transports: WIFI ... ]
onAvailable 642
onCapabilitiesChanged 642 [ Transports: WIFI ... ]
onCapabilitiesChanged 642 [ Transports: WIFI ... ]
onCapabilitiesChanged 642 [ Transports: WIFI ... ]
onCapabilitiesChanged 642 [ Transports: WIFI ... ]
onCapabilitiesChanged 642 [ Transports: WIFI ... ]
onLost 641
onLost 641
onLost 642
onLost 642
onAvailable 643
onCapabilitiesChanged 643 [ Transports: CELLULAR ... ]
onAvailable 643
onCapabilitiesChanged 643 [ Transports: CELLULAR ... ]
onCapabilitiesChanged 643 [ Transports: CELLULAR ... ]
onCapabilitiesChanged 643 [ Transports: CELLULAR ... ]
关于Android ConnectivityManager onAvailable 有时不返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55823422/
我们使用 Android ConnectivityManager 来监听我们应用程序内部的互联网连接变化,如下所示。 class MainActivity : AppCompatActivity()
我正在尝试通过内部 wifi 网络将远程数据发送到 App Center,但它不是在此网络上发送,而是在任何外部网络上发送。调试时发现当设备连接到内部 wifi 时不会调用方法 onAvailable
我是一名优秀的程序员,十分优秀!