Android, как указать, когда интернет-соединение потеряно?

Я разрабатываю приложение для Android, и я хочу получать уведомления, когда соединение с Интернетом (Wi-Fi или соединение с пакетной передачей данных) потеряно. В моем подходе я могу получить статус соединения как:

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

имея это в манифесте:

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

Как я могу получать автоматические уведомления при потере соединения?


person Dinithe Pieris    schedule 20.01.2014    source источник
comment
Приведенный выше код — это стандартный способ проверить, есть ли интернет или нет, так что у вас за вопрос?   -  person Scary Wombat    schedule 20.01.2014
comment
см. здесь stackoverflow.com/questions/3119607/   -  person Gopal Gopi    schedule 20.01.2014
comment
@user2310289 user2310289: необходимо вызвать метод isNetworkAvailable();, чтобы узнать статус соединения. это нормально, когда приложение запускается. но пока приложение работает, это не очень хороший способ справиться с требованием   -  person Dinithe Pieris    schedule 20.01.2014


Ответы (4)


Для WIFI вы можете зарегистрировать широковещательный приемник как:

IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION);
registerReceiver(broadcastReceiver, intentFilter);

Вы также можете зарегистрировать приемник в манифесте.

Затем в вашем ресивере:

@Override
public void onReceive(Context context, Intent intent) {
    final String action = intent.getAction();
    if (action.equals(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION)) {
        if (intent.getBooleanExtra(WifiManager.EXTRA_SUPPLICANT_CONNECTED, false)){
            //do stuff
        } else {
            // wifi connection was lost
        }
    }
}

Для любого типа прослушивателей подключения к данным вы можете использовать следующий приемник, зарегистрированный как:

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

и в вашем ConnectivityReceiver:

public class ConnectivityReceiver extends BroadcastReceiver {

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

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

person gunar    schedule 20.01.2014
comment
не могли бы вы объяснить registerReceiver(broadcastReceiver, intentFilter); - person Dinithe Pieris; 20.01.2014
comment
это также работает, когда мобильное соединение для передачи данных потеряно? - person emilpmp; 13.12.2017
comment
Это намерение действие/константа устарело на уровне API 28. - person Sundeep1501; 02.10.2018

используйте следующий код:

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import classes.NetworkUtil;

public class NetworkChangeReceiver extends BroadcastReceiver {

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

            boolean IsConnected = NetworkUtil.getConnectivityStatusString(context);
           // Toast in here, you can retrieve other value like String from NetworkUtil
           // but you need some change in NetworkUtil Class
        }
    }

и NetworkUtil это:

package classes;

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;

public class NetworkUtil {

    public static int TYPE_WIFI = 1;
    public static int TYPE_MOBILE = 2;
    public static int TYPE_NOT_CONNECTED = 0;


    public static int getConnectivityStatus(Context context) {
        ConnectivityManager cm = (ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE);

        NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
        if (null != activeNetwork) {
            if(activeNetwork.getType() == ConnectivityManager.TYPE_WIFI)
                return TYPE_WIFI;

            if(activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE)
                return TYPE_MOBILE;
        } 
        return TYPE_NOT_CONNECTED;
    }

    public static boolean getConnectivityStatusString(Context context) {
        int conn = NetworkUtil.getConnectivityStatus(context);
        boolean status = false ;
        if (conn == NetworkUtil.TYPE_WIFI) {
            status = true;
        } else if (conn == NetworkUtil.TYPE_MOBILE) {
            status = true; 
        } else if (conn == NetworkUtil.TYPE_NOT_CONNECTED) {
            status = false;
        }
        return status;
    }
}

и в файле манифеста:

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

и это разрешение:

 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
person Shayan Pourvatan    schedule 20.01.2014
comment
Это устарело для приложений, ориентированных на N и выше. Как правило, приложения не должны полагаться на эту трансляцию и вместо этого использовать JobScheduler. - person c-an; 21.06.2019
comment
Да, вы правы, вы должны использовать JobScheduler, WorkManager или программно зарегистрировать трансляцию @c-an, я написал этот ответ в 2014 году. - person Shayan Pourvatan; 22.06.2019

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

Добавьте их в качестве фильтров намерений.

            <intent-filter>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
                <action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
            </intent-filter>
person Hades    schedule 20.01.2014

Вы должны использовать BroadcastReceivers для ваших требований. Создайте BroadcastReceiver, который прослушивает изменения в сети.

В случае каких-либо изменений в сети он автоматически запустит событие, и вы сможете выполнять свои операции с ним.

person Kitkat    schedule 20.01.2014