5

한 번 prob가 발생하면 정말 도움이되었습니다. 그래서 여기에 나는 또 다른 문제에 빠졌습니다 .../getBoolean (EXTRA_NO_CONNECTIVITY)는 항상 false를 반환합니다.

BroadcastReceiver를 확장하는 사용자 지정 NetworkReceiver를 실행하고 있습니다. 전화가 인터넷에 연결되어있을 때이를 감지하여 필요할 때마다 서비스를 시작할 수 있습니다. 나는 주제의 많은 나를 위해 작동하지 않는 모든 주제에 더 많거나 적은 프롬프트에 다음 코드를 읽고 :

public class NetworkReceiver extends BroadcastReceiver { 

private static final String tag = NetworkReceiver.class.getSimpleName(); 

@Override 
public void onReceive(Context context, Intent intent) { 
    Log.i(tag,"****** NetworkReceiver // onReceive()"); 

    boolean noConnection = intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false); 

    if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) { 
     Log.i(tag,"****** NetworkReceiver // Network Down?: " + intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false)); 
    } 

    // TODO Bug: Never stops the service. Stays always connected! 
    if(noConnection) { 
     Log.i(tag,"****** NetworkReceiver // Stopping Service..."); 
     context.stopService(new Intent(context, FetchService.class)); 
    } else { 
     Log.i(tag,"****** NetworkReceiver // Starting Service!"); 
     context.startService(new Intent(context, FetchService.class)); 
    } 
} 

의 I는이 문제를 로그 캣은 항상 NetworkDown?: false 반환하고 서비스가 결코 중지 없다는 것입니다을 (그 항상 재시작). 나는 에뮬레이터에서 F8 키를 눌러 시험해 보았고 라우터를 끄면 내 dev-phone (SIM이없고 인터넷 액세스가 wifi 라우터에 있음)을 시도했지만 인터넷 액세스는 보장되지 않았습니다! intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false) intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, true) 에 :

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

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

나는 또한 내가 선을 변경할 때 나는 또한 변화없이 것을 내 매니페스트 파일에 <action android:name="android.net.ConnectivityManager.CONNECTIVITY_ACTION" />을 시도 있음을 유의하십시오 :

내 매니페스트는 다음 행을 포함 결과는 항상 사실이었습니다. 따라서 항상 내 서비스를 중단하고 서비스를 시작하려하지 않았습니다.

인 텐트의 엑스트라가 전혀 읽히지 않는다고 생각합니다. 따라서 기본값 인 getBooleanExtra()이 항상 반환됩니다.

추신. Android 2.1입니다.

고마워요!

답변

3

BroadcastReceiver 안에 읽을 수없는 추가 기능에 대해서는 확신 할 수 없지만 비슷한 목적으로 BroadcastReceiver을 사용하는 방법을 보여줄 수는 있습니다.

수신자는 연결 변경 사항 만 인식하지만 연결 상태는 평가하지 않습니다. 그것은 Service 대신에 (연결 되었든 안되든)이 서비스가 할 일이 있기 때문에 알려줍니다.

public class ConnectivityReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     final Intent intentService = new Intent(context, MyService.class); 
     intentService.putExtra(MyService.INTENT_HANDLE_CONNECTIVITY_CHANGE, ""); 

     context.startService(intentService); 
    } 
} 

그런 다음 내 서비스에, 나는 평가 않습니다 : 그것은 하나를 시작하거나 "통보"할 수 있도록이 서비스는, 그 시간에 실행 중이거나 할 수는 없습니다 (이 호출하지 둥지 you can safely call startService() several times 기억) 연결성을 유지하고 이에 따라 행동하십시오. 당신처럼 내가 연결 상태 같은 방법으로 평가하지 않도록주의하고, 작품 아래의 코드가 아니라 당신 (아래에만 관련 코드) 이유는 다음과 같을 수 있습니다

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    if (intent != null) { 
     final Bundle bundle = intent.getExtras(); 

     // Handle the intent INTENT_HANDLE_CONNECTIVITY_CHANGEif any 
     if ((bundle != null) && (bundle.get(INTENT_HANDLE_CONNECTIVITY_CHANGE) != null)) {   
      handleConnectivity(); 
     } 
    } 

    return START_STICKY; 
} 

private void handleConnectivity() { 
    final ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
    final NetworkInfo netInfo = cm.getActiveNetworkInfo(); 

    if(netInfo != null && netInfo.isConnected()) { 
     // WE ARE CONNECTED: DO SOMETHING 
    } 
    else { 
     // WE ARE NOT: DO SOMETHING ELSE  
    } 
} 

이 아래에, 잘 작동이 Android-7 (2.1)도 있습니다.

+0

내가 사용하는 방법에 대해 알고 있습니다. 그러나 나는 많은 사람들이 내가 사용한 코드를 추천했다는 사실에 조금 놀랐다. (나는 최근에 안드로이드에서 구입 한 O'reilly 책에서도 읽었다.) 내가 CONNECTIVITY_ACTION 브로드 캐스트 솔루션을 찾을 수 없다면 나는 당신의 예제를 따르고 ConnectivityManager의 메서드를 사용하여 내 서비스의 체크를 할 것이라고 생각한다. 답장을 보내 주셔서 감사합니다 :) – snoopaki

+0

당신은 @ snoopaki 환영합니다 - 실제로 내가 원하는 방법을 사용하여 솔루션을 선호하는 것입니다,하지만 난 그냥 무슨 일이 일어나지 않는 이유를 볼 수 있습니다. – Shlublu

+1

실제로 서비스를 IntentService로 변경했으며 연결 변경 사항에 대한 처리 중 처리가 더 적합했습니다. 그래서 나는 적절하게 당신의 대답을 올바른 것으로 선택해야합니다! thx :) – snoopaki

2

는 이상한 NO_CONNECTIVITY 플래그에 대해 알고하지 않습니다,하지만 당신은 의도에서 활성 네트워크를 검색 할 수 있습니다 : 당신은 아마이 객체는, isConnected()를 호출 할 수 있습니다

(NetworkInfo) intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO); 

.

+1

고맙습니다. 회신을 위해, 나는 그것을 명심할 것입니다. 현재 작업의 경우, 위의 대답을 사용하고 그것은 아주 잘 atm 작동합니다. – snoopaki

+1

이 상수는 이제 더 이상 사용되지 않습니다. –

관련 문제