Android ConnectivityManager onAvailable有时未返回

时间:2019-04-24 06:10:40

标签: android android-connectivitymanager

我们使用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 ")
        }
    }
}

除了我们遇到的两个问题之外,此实施效果很好

  1. 如果我们同时使用wifi和移动数据连接到Internet并关闭wifi,则有时会触发onLost()回调,然后触发onAvailable(),但在其他情况下 onLost()被触发,这是不正确的。

  2. 如果没有Internet连接并打开应用程序onLost(),则不会触发,但是如果我们有Internet连接并打开应用程序onAvailable(),则会触发。

    < / li>

任何帮助,建议,变通办法或其他可靠地检测Internet连接更改的方法,将不胜感激。

在Xioami A2(Android 9),OnePlus(Android 9)上进行了测试

DEMO项目
https://github.com/PhanVanLinh/AndroidNetworkChangeReceiver

3 个答案:

答案 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