5

Pewnego razu, gdy miałem problem, byliście naprawdę pomocni. Więc znowu mam inny problem, na który wpadłem ...:/getBoolean (EXTRA_NO_CONNECTIVITY) zawsze zwraca wartość false

Używam niestandardowego NetworkReceiver, który rozszerza BroadcastReceiver. Chcę wykryć, kiedy telefon ma połączenie z Internetem, aby móc uruchomić usługę w dowolnym momencie. Czytałem wiele tematów i wszystkie tematy mniej lub bardziej szybka do następującego kodu, który nie działa dla mnie:

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

Mam problem jest taki, że logcat zawsze zwraca NetworkDown?: false i obsługa nigdy nie zatrzymuje się (to restartuje się cały czas). Próbowałem go na emulatorze, naciskając klawisz F8, a także wypróbowałem go na moim dev-phone (nie ma karty SIM, dostęp do Internetu jest przez mój router wifi) poprzez wyłączenie routera -> brak dostępu do Internetu gwarantowany!

My Manifest zawiera następujące wiersze:

... 
<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> 
... 

I należy również pamiętać, że ja też próbowałem <action android:name="android.net.ConnectivityManager.CONNECTIVITY_ACTION" /> w moim pliku manifestu bez zmian i że kiedy zmienił linię: intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false) do intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, true) wynik był zawsze prawdziwy - i dlatego zawsze starał się zatrzymać moją usługę i nigdy jej nie uruchamiał.

Podejrzewam, że dodatki z Intencji nie są w ogóle czytane i dlatego domyślna wartość getBooleanExtra() zawsze powraca.

PS. Jestem na systemie Android 2.1

Dzięki!

Odpowiedz

3

Nie mam pewności, co do dodatków, których nie można odczytać wewnątrz BroadcastReceiver, ale mogę pokazać ci sposób, w jaki korzystam z BroadcastReceiver w celu podobnym do twojego.

Mój odbiornik przechwytuje tylko zmiany łączności, ale NIE ocenia stanu połączenia. Informuje on o tym, że w obu przypadkach (połączony lub nie) ta usługa będzie miała coś do zrobienia. Usługa ta może być uruchomiony lub nie w tym czasie, więc będzie albo być rozpoczęte lub „poinformowany” (należy pamiętać, że you can safely call startService() several times takie rozmowy nie NEST):

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

Następnie w mojej służbie, mam ocenić łączność, a następnie podjąć odpowiednie działania. Zauważ, że nie ocenia stanu połączenia w taki sam sposób, jak to zrobić, i to może być, dlaczego kod poniżej utworów, ale nie twoje (poniżej jest tylko odpowiedni kod):

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

To działa prawidłowo, pod Android-7 (2.1).

+0

Jestem świadomy metody, którą stosowałeś. Jednak byłem trochę zaskoczony, że wiele osób poleca kod, którego użyłem (przeczytałem go także na książce O'reilly, którą ostatnio kupiłem na Androida!Jeśli nie mogę znaleźć rozwiązania w transmisji CONNECTIVITY_ACTION, myślę, że pójdę za twoim przykładem i wykonam kontrolę w mojej usłudze za pomocą metod ConnectivityManager. Dzięki za odpowiedź :) – snoopaki

+0

Serdecznie zapraszamy @snoopaki - właściwie wolałbym przyjść z rozwiązaniem za pomocą twojej metody, ale po prostu nie widzę, co się dzieje i dlaczego. – Shlublu

+1

Faktycznie zmieniłem moją usługę na IntentService, a obsługa w działaniu zmiany połączenia miała więcej sensu. Więc powinienem wybrać odpowiedź jako właściwą !! thx :) – snoopaki

2

nie wiem o dziwnej flagą NO_CONNECTIVITY, ale można pobrać aktywną sieć z zamiarem:

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

prawdopodobnie można po prostu zadzwonić isconnected() na tym obiekcie.

+1

Niż za odpowiedź, będę o tym pamiętać. Do bieżącego zadania użyłem powyższej odpowiedzi i działa całkiem nieźle :) – snoopaki

+1

Ta stała jest teraz przestarzała. –

Powiązane problemy