Подтвердить что ты не робот

Пример прослушивателя в Интернете для Android

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

Есть ли что-нибудь вроде Internet Listener? или как реализовать это событие, когда когда-либо доступ к Интернету недоступен, он должен предупредить.

4b9b3361

Ответ 1

Создайте для этого один широковещательный приемник и зарегистрируйте его в файле манифеста.

Сначала создайте новый класс NetworkStateReceiver и расширьте BroadcastReceiver.

public class NetworkStateReceiver extends BroadcastReceiver {
    public void onReceive(Context context, Intent intent) {
     Log.d("app","Network connectivity change");
     if(intent.getExtras()!=null) {
        NetworkInfo ni=(NetworkInfo) intent.getExtras().get(ConnectivityManager.EXTRA_NETWORK_INFO);
        if(ni!=null && ni.getState()==NetworkInfo.State.CONNECTED) {
            Log.i("app","Network "+ni.getTypeName()+" connected");
        }
     }
     if(intent.getExtras().getBoolean(ConnectivityManager.EXTRA_NO_CONNECTIVITY,Boolean.FALSE)) {
            Log.d("app","There no network connectivity");
     }
   }
}

Поместите этот код в свой AndroidManifest.xml под элементом "application":

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

И добавьте это разрешение

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

ИЗМЕНИТЬ

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

public static boolean hasActiveInternetConnection(Context context) {
    if (isNetworkAvailable(context)) {
        try {
            HttpURLConnection urlc = (HttpURLConnection) (new URL("http://www.google.com").openConnection());
            urlc.setRequestProperty("User-Agent", "Test");
            urlc.setRequestProperty("Connection", "close");
            urlc.setConnectTimeout(1500); 
            urlc.connect();
            return (urlc.getResponseCode() == 200);
        } catch (IOException e) {
        Log.e(LOG_TAG, "Error checking internet connection", e);
        }
    } else {
    Log.d(LOG_TAG, "No network available!");
    }
    return false;
}

Ответ 2

Код от Чирага Раваля выше, безусловно, работает. Проблема в том, что прослушиватель будет вызван, даже если приложение не работает на переднем плане.

IMHO, лучший подход - зарегистрировать/отменить регистрацию получателя в методах onResume()/onPause() всех ваших приложений. Этот код должен сделать это:

private final NetworkStateReceiver stateReceiver = new NetworkStateReceiver();

@Override
protected void onResume() {
    super.onResume();
    IntentFilter filter = new IntentFilter();
    filter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
    registerReceiver(stateReceiver, filter);
}

@Override
protected void onPause() {
    super.onPause();
    unregisterReceiver(stateReceiver);
}

Очевидно, удалите регистрацию из файла AndroidManifest.xml.

Используя это решение, приемник будет вызван также при переключении между действиями вашего приложения (при условии, что вы их закрываете). В таком случае используйте статический флаг (разделяемый всеми вашими действиями), как в приведенном ниже примере (называемый online):

public class NetworkStateReceiver extends BroadcastReceiver {

    private static boolean online = true;  // we expect the app being online when starting

    public static final String TAG = NetworkStateReceiver.class.getSimpleName();

    public void onReceive(Context context, Intent intent) {
        Log.d(TAG,"Network connectivity change");
        ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo ni = manager.getActiveNetworkInfo();
        if (ni == null || ni.getState() != NetworkInfo.State.CONNECTED) {
            Log.d(TAG,"There no network connectivity");
            if (online) // don't show the message if already offline
                Toast.makeText(context, R.string.noInternet, Toast.LENGTH_SHORT).show();
            online = false;
        } else {
            Log.d(TAG,"Network "+ni.getTypeName()+" connected");
            if (!online)  // don't show the message if already online
                Toast.makeText(context, R.string.backOnline, Toast.LENGTH_SHORT).show();
            online = true;
        }
    }
}

При запуске приложения в автономном режиме появится сообщение Toast; в противном случае оно появляется только при потере/восстановлении соединения.