Android ConnectivityManager onAvailable 有时未返回

Pha*_*inh 6 android android-connectivitymanager

我们使用 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 ")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

除了我们遇到的两个问题外,此实现运行良好

  1. 如果我们同时使用 wifi 和移动数据连接到互联网并关闭 wifi 有时会onLost()触发回调onAvailable(),如预期的那样,但在其他情况下 onLost()触发这是不正确的。

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

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

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

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

nur*_*gin 1

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

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