Android ConnectivityManager onAvailable иногда не возвращается - PullRequest
2 голосов
/ 24 апреля 2019

Мы используем 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. Если мы подключаемся к Интернету, используя как Wi-Fi, так и мобильные данные, и отключаем Wi-Fi, иногда вызывается обратный вызов onLost(), за которым следует onAvailable(), как и ожидалось, но в других случаях * только 1011 * onLost() запущен, что неправильно.

  2. Если у нас нет подключения к Интернету и мы не открываем приложение, onLost() не запускается, однако, если у нас есть подключение к Интернету и мы открываем приложение, onAvailable() запускается.

Любая помощь, предложения, обходные пути или другие подходы для надежного обнаружения изменений в подключении к Интернету будут очень полезны.

Проверено на Xioami A2 (Android 9), OnePlus (Android 9)

ДЕМО-проект
https://github.com/PhanVanLinh/AndroidNetworkChangeReceiver

Ответы [ 2 ]

1 голос
/ 06 мая 2019

Я использовал ваш проект и добавил другой метод: onCapabilitiesChanged.Я начал с включенного режима полета, затем выключил и снова включил.Это журналы:

onAvailable 632

onCapabilitiesChanged 632 [Транспорты: CELLULAR ...]

onAvailable 632

onCapabilitiesChanged 632 [Транспорты: CELLULAR ...]

onAvailable 632

onCapabilitiesChanged 632 [Транспорты: CELLULAR ...]

onCapabilitiesChanged 632 [Транспорты: CELLULAR ...]

onCapabilitiesChanged 632 [Транспорты: CELLULAR ...]

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 [Транспорт: CELLULAR ...]

onAvailable 634

onCapabilitiesChanged 634 [Транспорт: CELLULAR ...]

onAvailable 634

onCapabilitiesChanged 634 [Транспорты: CELLULAR ...]

onCapabilitiesChanged 634 [Транспорты: CELLULAR ...]

onCapabilitiesChanged 634 [Транспорты: CELLULAR ...]

onCapabilitiesChanged 634 [Транспорты: CELLULAR ...]

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 [Transports: WIFI ...]

onCapabilitiesChanged 635 [Transports: WIFI ...]

Как вы можете видеть, LOST для сотового транспорта, в то время какAVAILABLE для WiFi

В соответствии с вашим вариантом использования (включить Wi-Fi, включить мобильные данные, отключить данные Wi-Fi, включить Wi-Fi, отключить Wi-Fi) это то, что я получаю.

onAvailable 640

onCapabilitiesChanged 640 [Транспорты: WIFI ...]

onAvailable 640

onCapabilitiesChanged 640 [Транспорты: WIFI ...]

onCapabilitiesChanged 640 [Транспорты: WIFI ...]

onCapabilitiesChanged 640 [Транспорты: WIFI ...]

onCapabilitiesChanged 640 [Транспорты: WIFI ...]

onCapabilitiesChanged 640[Транспорты: WIFI ...]

onLost 640

onLost 640

onAvailable 641

onCapabilitiesChanged 641 [Транспорт: CELLULAR ...]

onAvailable 641

onCapabilitiesChanged 641 [Транспорт: CELLULAR ...]

onCapabilitiesChanged 641 [Транспорты: CELLULAR ...]

onCapabilitiesChanged 641 [Транспорты: CELLULAR ...]

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

onAvailable643

onCapabilitiesChanged 643 [Транспорты: CELLULAR ...]

onAvailable 643

onCapabilitiesChanged 643 [Транспорты: CELLULAR ...]

onCapabilitiesChanged 643 [Транспорт: CELLULAR ...]

onCapabilitiesChanged 643 [Транспорт: CELLULAR ...]

1 голос
/ 30 апреля 2019

Определение приемника вещания на AndroidManifest немного изменилось. Соответствующее описание вы можете найти на здесь .

Вы уже реализовали этот способ, но в любом случае я хотел бы добавить Ссылки на класс обратного вызова в сети в качестве контрольной точки.

...