Проверка подключения к сети отличается в Android 6 и Android 7 при запуске приложения
Мое приложение представляет собой приложение в режиме киоска (если пользователь не введет код, он не сможет получить доступ ни к каким приложениям Android). Поэтому, когда вкладка загружается, в сервисе необходимо выполнить некоторые настройки. Я использую приведенный ниже код для проверки подключения к сети (этот код повторно используется как часть служебного класса в моей работе). Если есть доступная сеть, мне нужно выполнить команду, иначе должно быть запущено событие.
ConnectivityManager connectivityManager
= (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
return activeNetworkInfo != null && activeNetworkInfo.isConnected();
В Android 7 этот код работает без нареканий. При загрузке, поскольку есть SIM-карта и сетевое подключение, я могу выполнить команду.
Но в Android 6, даже когда есть доступность сети, код всегда возвращает не подключен /OFFLINE. Это происходит при загрузке устройства. Но подключение возвращается true после запуска приложения.
Внутренне ConnectivityManager.activeNetworkInfo основан на BroadcastReceiver с IntentFilter ConnectivityManager.CONNECTIVITY_ACTION. Из журналов видно, что CONNECTIVITY_ACTION регистрируется во время установки приложения, но этого не происходит при загрузке устройства.
Я попытался проверить сетевое соединение в классе, который расширяет приложение, но это также не работает - я думал, что эта проверка заставит приложение знать при запуске, что существует сетевое соединение.
1 ответ
Чтобы правильно дождаться подключения к сети:
- Начните свою активность в киоске при загрузке с загрузочного приемника.
- Когда приложение запустится, зарегистрируйте свой приемник в приложении, программно в своей деятельности. Не регистрируйте это в манифесте. Зарегистрированные получатели для
CONNECTIVITY_ACTION
устарели. Если вы ориентируетесь на API 22+, вы можете использоватьConnectivityManager.requestNetwork()
с обратным вызовом вместо трансляции (здесь не описано). - Возвращаемое значение
registerReceiver()
является намерением, которое является текущим состоянием сети (CONNECTIVITY_ACTION
это липкая трансляция). Действуй на этом. Если у намерения есть дополнительныйEXTRA_NO_CONNECTIVITY
тогда нет сетевого подключения, и ваше приложение должно дождаться срабатывания приемника, а затем снова проверить подключение. - Помните, что подключение может увеличиваться и уменьшаться в любое время, поэтому вашему приемнику необходимо инициировать изменения в вашем пользовательском интерфейсе для достижения этой цели.
Разные устройства и разные версии Android и разные типы сетей (включая разные SIM-карты) могут вызывать различные задержки в отношении подключения сетевого интерфейса. Это определенно не связано с запуском вашего приложения или с его запуском и т. Д. Когда вы звоните getActiveNetworkInfo()
это просто заглушка, которая выполняет IPC для системного сервера, чтобы получить реальное значение. В вашем процессе нет логики или состояния.