2012-08-28 45 views
25

我正在开发Android应用程序,该应用程序将与Internet保持连接。如果互联网出现故障,它应该给用户提供适当的信息。互联网监听器Android示例

有没有像Internet Listener这样的东西?或如何实施这个事件,当互联网连接不可用时,应该给予警报。

+0

这其他Q&A可以帮助: http://stackoverflow.com/questions/1560788/how-to-check-internet-access-on-android-inetaddress-never-timeouts – helios

+0

的http://开发商.android.com/training/monitoring-device-state/connectivity-monitoring.html –

回答

48

为此创建一个广播接收器并将其注册到清单文件中。

首先创建一个新类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's no network connectivity"); 
    } 
    } 
} 

将这个代码在你的AndroidManifest.xml中的 “应用程序” 元素:

<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; 
} 
+0

Samples here:http://stackoverflow.com/questions/6176570/checking-the-networking-connectivity-using-broadcastreceiver-in-android – helios

+0

我已经尝试过这个解决方案,但这不是工作伙计。在super.onReceive(context,intent)中也会出错。 –

+0

什么是错误? –

1

以上Chirag Raval的代码当然有效。问题在于,即使应用程序没有在前台运行,侦听器也会被调用。

恕我直言,更好的方法是在所有应用程序活动的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's 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; 
     } 
    } 
} 

如果是脱机时开始您的应用,会出现吐司消息;否则它只会在丢失/重新建立连接时出现。