2017-01-02 6 views
-1

Я создаю приложение для Android, которое уведомляет пользователя, когда интернет-соединение снова активировано. Он/она должен включить эту функцию, когда Интернет не работает. Каков наилучший способ сделать это? В настоящее время я запускаю бесконечный цикл запроса ping для google в службе, но он не продолжается после нескольких тысяч запросов. Есть ли более простые или лучшие способы достижения этого? Спасибо.Каков наилучший способ в android проверить, активно ли Интернет активно (когда интернет неактивен)?

Редактировать: Большинство ответов и ссылок проверяют, только если мое устройство подключено к Wi-Fi. Но что, если мое устройство подключено к моему маршрутизатору, но интернет-соединение не работает?

+1

Прочтите это https://developer.android.com/training/monitoring-device-state/connectivity-monitoring.html#MonitorChanges –

+0

Держу пари, что этот вопрос получит 6 или более ответов: D до его блокировки –

+1

Вы проигрываете. Что мы делаем? :) –

ответ

2

Я использую широковещательную рассылку, чтобы проверять соединение каждый раз. Создайте класс для информации о подключении.

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


public class ConnectivityStatus extends ContextWrapper{ 

    public ConnectivityStatus(Context base) { 
     super(base); 
    } 

    public static boolean isConnected(Context context){ 

     ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo connection = manager.getActiveNetworkInfo(); 
     if (connection != null && connection.isConnectedOrConnecting()){ 
      return true; 
     } 
     return false; 
    } 
} 

Применить код в активность:

private BroadcastReceiver receiver = new BroadcastReceiver() { 
@Override 
public void onReceive(Context context, Intent intent) { 
     if(!ConnectivityStatus.isConnected(getContext())){ 
      // no connection 
     }else { 
      // connected 
     } 
    } 
}; 

Регистрация вещания в onCreate() методе вашей деятельности по:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.your_layout); 
    your_activity_context.registerReceiver(receiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)); 
    .. 
    ... 
    .... 
    } 

Не забудьте незарегистрированный/зарегистрироваться на цикле активность:

@Override 
protected void onResume() { 
    super.onResume(); 
    your_activity_context.registerReceiver(receiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)); 

} 

@Override 
protected void onPause() { 
    super.onPause(); 
    your_activity_context.unregisterReceiver(receiver); 

} 
0

Вы можете использовать широковещательный приемник для непрерывной проверки доступности Интернета. Получатель уведомит вас, когда доступен Интернет.

Посетите эту страницу, его помощь вам : Broadcast receiver for checking internet connection in android app

0

Создать простой запрос пинг на google.com и запустить фоновый поток, используя залп или другую сетевую библиотеку в своей деятельности, чтобы сохранить Pinging. При ответе проверьте код ответа сети. Если это код ошибки сервера (серия 5xx), ваш Интернет недоступен. Если вы получите код ОК (2xx series), то у вас есть рабочее интернет-соединение. В обоих случаях сохраняйте задержку повторной попытки 500 мс и продолжайте собирать ответы о доступности сети.

В качестве альтернативы, используйте сетевой менеджер Android. Этот класс может быть реализован следующим образом:

public class NetworkConnectivity { 
    Context context; 

    private Context _context; 

    public NetworkConnectivity(Context context){ 
     this._context = context; 
    } 

    public boolean isNetworkConnected(){ 
     ConnectivityManager connectivity = (ConnectivityManager) _context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     if (connectivity != null) 
     { 
      NetworkInfo[] info = connectivity.getAllNetworkInfo(); 
      if (info != null) 
       for (int i = 0; i < info.length; i++) 
        if (info[i].getState() == NetworkInfo.State.CONNECTED) 
        { 
         return true; 
        } 

     } 
     return false; 
    } 
} 

вызов isNetworkConnected() на каждые 500 мс от фонового потока и использовать ответ (правда для связи и ложного для не подключен) в соответствии с тем, что вы хотите делать с этим знанием о состояние соединения.