Как проверить, было ли устройство отключено от Интернета? - PullRequest
0 голосов
/ 18 марта 2019

Я нашел код проверки того, подключено ли устройство к Интернету. Код выглядит следующим образом

private boolean isNetworkAvailable() {
    ConnectivityManager connectivityManager 
          = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
    return activeNetworkInfo != null && activeNetworkInfo.isConnected();
}

Мой вопрос: что, если это вернет ИСТИНА , но устройство внезапно потеряло соединение? Как я могу получить сигнал, который сообщит мне, что я потерял свое интернет-соединение в точке ЛЮБОЙ , когда мое приложение работает?

1 Ответ

0 голосов
/ 18 марта 2019

Вы можете достичь таргетинга в приложении ниже N.

В AndroidManifest.xml вам необходимо добавить следующее разрешение.

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

Вот ваш получатель в файле manfest.

<receiver android:name=".NetworkStateReceiver" >
    <intent-filter>
        <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
    </intent-filter>
</receiver>

Вот ваш широковещательный приемник

public class NetworkStateReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

    if(isDeviceOnline()){

      }    
}


private boolean isDeviceOnline() {
        ConnectivityManager connMgr =
                (ConnectivityManager) Collect.getInstance().getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
        return networkInfo != null && networkInfo.isConnected();
    }

Но объявление широковещательного приемника для android.net.conn.CONNECTIVITY_CHANGE устарело для приложений, нацеленных на N и выше.

InВ общем, приложения не должны полагаться на эту трансляцию и вместо этого использовать JobScheduler или GCMNetworkManager.

Эта проблема помечает код, который либо * отрицательно влияет на срок службы батареи, либо * использует API, которые недавно изменили поведение, чтобы предотвратить чрезмерное потребление памяти и батареи фоновыми задачами.
Как правило, вы должны использовать JobScheduler или GcmNetworkManagerвместо этого.
Подробнее о том, как обновить код,

Подробнее

Планирование сетевых заданий для неизмеренных соединений

При использовании класса JobInfo.Builder для создания объекта JobInfo примените метод setRequiredNetworkType () и передайте JobInfo.NETWORK_TYPE_UNMETERED в качестве параметра задания.В следующем примере кода показано, что служба запускается, когда устройство подключается к неизмеренной сети и заряжается:

public static final int MY_BACKGROUND_JOB = 0;
...
public static void scheduleJob(Context context) {
  JobScheduler js =
      (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
  JobInfo job = new JobInfo.Builder(
    MY_BACKGROUND_JOB,
    new ComponentName(context, MyJobService.class))
      .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
      .setRequiresCharging(true)
      .build();
  js.schedule(job);
}

Подробнее см. Здесь

...