2012-08-28 3 views
25

나는 인터넷과 계속 연결되어있는 Android 앱에서 작업 중입니다. 인터넷이 다운되면 적절한 메시지를 사용자에게 제공해야합니다.인터넷 수신기 Android 예제

인터넷 수신기와 같은 것이 있습니까? 또는 인터넷 연결이 불가능할 때 경고를 제공해야하는이 이벤트를 구현하는 방법.

+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를 확장하십시오. 단지

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

편집

이 코드는이 권한을

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

을 그리고 추가

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에이 코드를 넣어 연결 변경을 감지하지만이를 알 수는 없는지 여부 인터넷에 연결되어있는 네트워크에 인터넷이 연결되어 있습니다. 이 방법을 사용하여 다음을 확인하십시오. -

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

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

+0

나는이 해결책을 시도했지만 이것은 잘 작동하지 않았다. 또한 super.onReceive (context, intent)에서 에러를 준다; –

+0

무엇이 오류입니까? –

1

위의 Chirag Raval 코드는 확실히 작동합니다. 문제는 애플리케이션이 포 그라운드에서 실행되지 않는 경우에도 리스너가 호출된다는 것입니다.

IMHO, 더 나은 방법은 모든 응용 프로그램 활동의 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; 
     } 
    } 
} 

, 토스트 메시지가 나타납니다; 그렇지 않으면 연결이 끊어 지거나 다시 연결될 때만 나타납니다.