Проверка подключения к сети отличается в 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 ответ

Чтобы правильно дождаться подключения к сети:

  1. Начните свою активность в киоске при загрузке с загрузочного приемника.
  2. Когда приложение запустится, зарегистрируйте свой приемник в приложении, программно в своей деятельности. Не регистрируйте это в манифесте. Зарегистрированные получатели для CONNECTIVITY_ACTION устарели. Если вы ориентируетесь на API 22+, вы можете использовать ConnectivityManager.requestNetwork() с обратным вызовом вместо трансляции (здесь не описано).
  3. Возвращаемое значение registerReceiver() является намерением, которое является текущим состоянием сети (CONNECTIVITY_ACTION это липкая трансляция). Действуй на этом. Если у намерения есть дополнительный EXTRA_NO_CONNECTIVITY тогда нет сетевого подключения, и ваше приложение должно дождаться срабатывания приемника, а затем снова проверить подключение.
  4. Помните, что подключение может увеличиваться и уменьшаться в любое время, поэтому вашему приемнику необходимо инициировать изменения в вашем пользовательском интерфейсе для достижения этой цели.

Разные устройства и разные версии Android и разные типы сетей (включая разные SIM-карты) могут вызывать различные задержки в отношении подключения сетевого интерфейса. Это определенно не связано с запуском вашего приложения или с его запуском и т. Д. Когда вы звоните getActiveNetworkInfo()это просто заглушка, которая выполняет IPC для системного сервера, чтобы получить реальное значение. В вашем процессе нет логики или состояния.

Другие вопросы по тегам