2012-02-12 2 views
5

서비스가 부팅 완료시 실행됩니다. 이 서비스는 인터넷 연결이 필요합니다. 기기가 인터넷에 연결되기를 기다리는 가장 좋은 방법은 무엇입니까? Wi-Fi의 모바일은 중요하지 않습니다.인터넷 연결이 설정 될 때까지 서비스 일시 중지

현재 솔루션에는 네트워크 중 하나가 사용 가능해질 때까지 ConnectivityManager를 확인하는 while 루프가 포함되지만 이는 저속한 느낌입니다.

더 좋은 방법이 있나요?

당신은 브로드 캐스트 리시버 사용할 수

답변

2

에서 유래하지만이 저속한 느낌

실제로 363,210

: D

  1. 서비스에 연결하는 수신기를 등록 (AFAIK를 부팅하는 동안 전화가 잠을하지 않는 한, 아마 단순한 의도 서비스를 할 것) 수신기가 깨어 의도 서비스를 깨어
  2. 서비스는 CountDownLatch를 수신기가 무선 랜이 연결되어있는 서비스 웨이크 업
  3. 에 대기

해골 코드 : https://stackoverflow.com/a/19968708/281545 - 와이파이를 깨우거나 Wi-Fi 잠금 장치 등을 잡을 필요가 없으므로 케이스가 더 간단합니다. 그렇지 않은 경우 (이 경우에는 무선 및 CPU 수면 시간이 길어지며 간단한 인 텐트 서비스로는 불가능합니다) 2와 3 :

2a. 서비스가 와이파이 잠금을 획득했습니다
2b. 서비스 전화 reconnect(), reassociate() 및 기타 (장치마다 다를 수 있음)

1

: 다음

private class ConnectionMonitor extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     String action = intent.getAction(); 
     if (!action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) 
      return; 
     boolean noConnectivity = intent.getBooleanExtra(
      ConnectivityManager.EXTRA_NO_CONNECTIVITY, false); 
     NetworkInfo aNetworkInfo = (NetworkInfo) intent 
      .getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO); 
     if (!noConnectivity) { 
      if ((aNetworkInfo.getType() == ConnectivityManager.TYPE_MOBILE) 
       || (aNetworkInfo.getType() == ConnectivityManager.TYPE_WIFI)) { 
       // start your service stuff here 
      } 
     } else { 
      if ((aNetworkInfo.getType() == ConnectivityManager.TYPE_MOBILE) 
       || (aNetworkInfo.getType() == ConnectivityManager.TYPE_WIFI)) { 
       // stop your service stuff here 
      } 
     } 
    } 
} 

, 당신은 당신의 코드 어딘가에 인스턴스화 :

ConnectionMonitor connectionMonitor = new ConnectionMonitor(); 
registerReceiver(connectionMonitor, intentFilter); 

참고 :이 코드는 Detect 3G or Wifi Network restoration

+0

연결이 설정 될 때마다 서비스가 실행되지 않습니까? 시작시 한 번만 서비스를 실행하면되고 연결이 가능할 때까지 기다려야합니다. 그것은 이미'android.intent.action.BOOT_COMPLETED'을 청취하는 BroadcastReceiver에 있습니다. – Lunchbox

+0

제 이해를 확인하십시오. 연결이 감지되는 즉시 서비스를 시작해야합니까? 그렇다면이 클래스를 공개 (자체 파일로)하고 startService (일부 컨텍스트를 전달해야 함) 메소드를 올바른 위치에두고 인스턴스 활동에서 BR을 인스턴스화하고 등록 할 수 있습니다. (서비스가 시작될 때 등록을 잊지 말것) – znat

+1

@Lunchbox : BOOT_COMPLETED 수신기에서 서비스를 시작했다는 것을 나타 냈습니다. 이미 인터넷에 연결되어 있지 않다고 판단되면이 응답의 코드가 해당 서비스로 전송됩니다. 사용자가 단순히 인터넷에 접속할 수 없거나 Android 4.0 이상에서 대역폭 할당량을 초과 한 경우 어떤 종류의 시간 초과 메커니즘이 필요할 수도 있습니다. – CommonsWare

관련 문제