2012-08-28 29 views
25

Tôi đang làm việc trên ứng dụng Android sẽ tiếp tục duy trì kết nối với Internet. Nếu Internet bị hỏng, nó sẽ cung cấp thông báo thích hợp cho Người dùng.Ví dụ về người nghe Internet trên Android

Có điều gì giống như Trình nghe Internet không? hoặc làm thế nào để thực hiện sự kiện này khi kết nối Internet không có sẵn, nó sẽ cảnh báo.

+0

Q & A khác này có thể giúp: http://stackoverflow.com/questions/1560788/how-to-check-internet-access-on-android-inetaddress-never-timeouts – helios

+0

http: // nhà phát triển .android.com/training/monitoring-device-state/connection-monitoring.html –

Trả lời

48

Tạo một Broadcast Receiver cho điều đó và đăng ký nó trong tệp kê khai.

Trước tiên, hãy tạo một lớp học mới NetworkStateReceiver và mở rộng 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"); 
    } 
    } 
} 

Đặt mã này trong AndroidManifest.xml của bạn dưới các yếu tố "ứng dụng":

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

Và thêm sự cho phép này

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

EDIT

Mã này chỉ phát hiện thay đổi kết nối nhưng không thể biết liệu mạng được kết nối với truy cập internet. Sử dụng phương pháp này để kiểm tra xem -

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

Mẫu tại đây: http://stackoverflow.com/questions/6176570/checking-the-networking-connectivity-using-broadcastreceiver-in-android – helios

+0

Tôi đã thử giải pháp này nhưng điều này không làm việc dude. cũng cho lỗi tại super.onReceive (ngữ cảnh, ý định); –

+0

lỗi là gì? –

1

Mã từ Chirag Raval ở trên chắc chắn hoạt động. Vấn đề là người nghe sẽ được gọi ngay cả khi ứng dụng không chạy ở nền trước.

IMHO, cách tiếp cận tốt hơn là đăng ký/hủy đăng ký người nhận theo phương thức onResume()/onPause() của tất cả các hoạt động ứng dụng của bạn. Mã này nên làm điều đó:

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

Rõ ràng, xóa đăng ký từ AndroidManifest.xml tệp.

Sử dụng giải pháp này, người nhận cũng sẽ được gọi khi chuyển đổi giữa các hoạt động của ứng dụng của bạn (giả sử bạn đang đóng chúng). Trong trường hợp này, sử dụng một lá cờ tĩnh (được chia sẻ giữa tất cả các hoạt động của bạn) như trong ví dụ dưới đây (gọi tắt là 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; 
     } 
    } 
} 

Nếu bắt đầu ứng dụng của bạn khi đang ngoại tuyến, thông điệp Toast sẽ xuất hiện; nếu không nó chỉ xuất hiện khi mất/thiết lập lại kết nối.