互联网监听器的Android例子

我正在开发Android应用程序,它将继续保持与Internet的连接。 如果互联网瘫痪,它应该给用户提供适当的信息。

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

Solutions Collecting From Web of "互联网监听器的Android例子"

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

首先创build一个新的类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文件的“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"/> 

编辑

此代码只是检测连接更改,但不能分辨它连接到的networking是否具有Internet访问权限。 使用这种方法来检查 –

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

来自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文件中删除注册。

使用这个解决scheme,接收者也会在应用程序的活动之间切换(假设你正在closures它们)。 在这种情况下,请使用静态标志(在所有活动之间共享),如下面的示例(称为“ 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; } } } 

如果在离线状态下启动应用程序,Toa​​st消息将会出现; 否则只有在丢失/重新build立连接时才会出现。