7

我们使用 AndroidConnectivityManager来监听我们应用程序内的互联网连接变化,如下所示。

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 和移动数据连接到互联网并关闭 wifi,有时会onLost()触发回调,然后按onAvailable()预期触发,但在其他情况下 onLost()触发不正确。

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

任何帮助、建议、解决方法或其他可靠地检测互联网连接变化的方法都将非常感激。

在小米 A2 (Android 9)、一加 (Android 9) 上测试

演示项目
https://github.com/PhanVanLinh/AndroidNetworkChangeReceiver

4

3 回答 3

3

我已经使用了您的项目,并添加了另一种方法:onCapabilitiesChanged. 我从 ebabled 的飞行模式开始,然后我关闭然后再次打开。这些是日志:

在可用 632

onCapabilitiesChanged 632 [传输:CELLULAR ...]

在可用 632

onCapabilitiesChanged 632 [传输:CELLULAR ...]

在可用 632

onCapabilitiesChanged 632 [传输:CELLULAR ...]

onCapabilitiesChanged 632 [传输:CELLULAR ...]

onCapabilitiesChanged 632 [传输:CELLULAR ...]

在可用 633

onCapabilitiesChanged 633 [传输:WIFI ...] onAvailable 633 onCapabilitiesChanged 633 [传输:WIFI ...]

在可用 633

onCapabilitiesChanged 633 [传输:WIFI ...]

onCapabilitiesChanged 633 [传输:WIFI ...]

onCapabilitiesChanged 633 [传输:WIFI ...]

onCapabilitiesChanged 633 [传输:WIFI ...]

onCapabilitiesChanged 633 [传输:WIFI ...]

onCapabilitiesChanged 633 [传输:WIFI ...]

632

632

632

第633章

第633章

第633章

在可用 634

onCapabilitiesChanged 634 [传输:蜂窝...]

在可用 634

onCapabilitiesChanged 634 [传输:蜂窝...]

在可用 634

onCapabilitiesChanged 634 [传输:蜂窝...]

onCapabilitiesChanged 634 [传输:蜂窝...]

onCapabilitiesChanged 634 [传输:蜂窝...]

onCapabilitiesChanged 634 [传输:蜂窝...]

在可用 635

onCapabilitiesChanged 635 [传输:WIFI ...]

在可用 635

onCapabilitiesChanged 635 [传输:WIFI ...]

在可用 635

onCapabilitiesChanged 635 [传输:WIFI ...]

onCapabilitiesChanged 635 [传输:WIFI ...]

onCapabilitiesChanged 635 [传输:WIFI ...]

onCapabilitiesChanged 635 [传输:WIFI ...]

634

634

634

onCapabilitiesChanged 635 [传输:WIFI ...]

onCapabilitiesChanged 635 [传输:WIFI ...]

如您所见,LOST是用于蜂窝传输,而AVAILABLEWiFi

按照您的用例(启用 wifi、启用移动数据、禁用 wifi 数据、启用 wifi、禁用 wifi)这就是我得到的。

可用 640

onCapabilitiesChanged 640 [传输:WIFI ...]

可用 640

onCapabilitiesChanged 640 [传输:WIFI ...]

onCapabilitiesChanged 640 [传输:WIFI ...]

onCapabilitiesChanged 640 [传输:WIFI ...]

onCapabilitiesChanged 640 [传输:WIFI ...]

onCapabilitiesChanged 640 [传输:WIFI ...]

onLost 640

onLost 640

在可用 641

onCapabilitiesChanged 641 [传输:CELLULAR ...]

在可用 641

onCapabilitiesChanged 641 [传输:CELLULAR ...]

onCapabilitiesChanged 641 [传输:CELLULAR ...]

onCapabilitiesChanged 641 [传输:CELLULAR ...]

在可用 642

onCapabilitiesChanged 642 [传输:WIFI ...]

在可用 642

onCapabilitiesChanged 642 [传输:WIFI ...]

onCapabilitiesChanged 642 [传输:WIFI ...]

onCapabilitiesChanged 642 [传输:WIFI ...]

onCapabilitiesChanged 642 [传输:WIFI ...]

onCapabilitiesChanged 642 [传输:WIFI ...]

641

641

642

642

在可用 643

onCapabilitiesChanged 643 [传输:CELLULAR ...]

在可用 643

onCapabilitiesChanged 643 [传输:CELLULAR ...]

onCapabilitiesChanged 643 [传输:CELLULAR ...]

onCapabilitiesChanged 643 [传输:CELLULAR ...]

于 2019-05-06T20:43:24.817 回答
1

也许您可以尝试使用requestNetwork而不是registerNetworkCallback.

于 2020-06-28T09:33:58.450 回答
1

AndroidManifest 上的广播接收器定义发生了一些变化。您可以在此处找到适当的描述。

您已经实现了这种方式,但无论如何我想添加网络回调类引用作为参考点。

于 2019-04-30T08:52:21.530 回答