Проверка подключения к сети отличается в Android 6 и Android 7 при запуске приложения - PullRequest
0 голосов
/ 31 мая 2018

Мое приложение - это приложение в режиме киоска (если пользователь не введет код, он не сможет получить доступ ни к каким приложениям 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 регистрируется во время установки приложения, но этого не происходит при загрузке устройства.

Я попытался проверить сетевое подключение для класса, расширяющего Application, но этотакже не работает - думая, что проверка сообщит приложению при запуске о наличии сетевого подключения.

1 Ответ

0 голосов
/ 31 мая 2018

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

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

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

...