2014-01-20 2 views
14

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

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" /> 

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

+0

Приведенный выше код является стандартным способом проверки наличия Интернета или нет, так что в чем ваш вопрос? –

+0

см. Здесь http://stackoverflow.com/questions/3119607/how-to-be-notified-on-wifi-network-status-change –

+0

@ user2310289: его необходимо вызвать метод 'isNetworkAvailable();' для получения знать состояние соединения. его нормально, когда приложение запускается.но в то время как приложение работает не так хорошо, как справиться с требованием –

ответ

8

Для 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 y ou может проверить, есть ли у вас подключение к Интернету или нет, this developer article.

+0

не могли бы вы объяснить 'registerReceiver (broadcastReceiver, intentFilter);' –

+0

Вы можете использовать 'registerReceiver', если вам интересно узнать о времени жизни' Activity'/'' обслуживания. В противном случае вы регистрируете 'BroadcastReceiver' непосредственно в манифесте, и поэтому вы получаете обновления все время, независимо от того, работает ли приложение или нет. ['registerReceiver'] (http://developer.android.com/reference/android/content/Context.html#registerReceiver (android.content.BroadcastReceiver, android.content.IntentFilter)) доступен в классе' Context'. Просто не забудьте вызвать unregisterReceiver, если вы зарегистрировались в классе Context. – gunar

+0

спасибо большое ... –

-2

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

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

0

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

Добавьте их в качестве целевых фильтров.

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

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

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" /> 
+0

Это отлично работает для меня! благодаря –

Смежные вопросы