5

Una volta che ho avuto un problema, voi ragazzi siete stati davvero d'aiuto. Quindi eccomi di nuovo con un altro problema su cui sono caduto ...:/getBoolean (EXTRA_NO_CONNECTIVITY) restituisce sempre false

Sto eseguendo un NetworkReceiver personalizzato che estende BroadcastReceiver. Voglio rilevare quando il telefono ha una connessione Internet in modo da poter avviare un servizio ogni volta che lo fa. Ho letto un sacco di argomenti e di tutti gli argomenti più o meno pronta al seguente codice che non funziona per me:

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

Il problema che ho è che il logcat ritorna sempre NetworkDown?: false e il servizio non si ferma mai (è riavvia tutto il tempo). L'ho provato sull'emulatore premendo F8 e l'ho provato anche sul mio dev-phone (non ha SIM, l'accesso internet è dal mio router wifi) spegnendo il router -> nessun accesso internet garantito!

mio manifesto include le seguenti righe:

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

Vorrei anche notare che ho anche provato <action android:name="android.net.ConnectivityManager.CONNECTIVITY_ACTION" /> nel mio file manifesto senza alcun cambiamento e che quando ho modificato la linea: intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false) a intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, true) il risultato era sempre vero, e quindi ha sempre cercato di fermare il mio servizio e non avviarlo mai.

Sospetto che gli Extra dall'Intento non vengano letti affatto ed è per questo che il valore predefinito di getBooleanExtra() restituisce sempre.

PS. Sono su Android 2.1

Grazie!

risposta

3

Non sono sicuro per gli Extra che non possono essere letti all'interno dello BroadcastReceiver, ma posso mostrarti come io uso lo BroadcastReceiver per uno scopo simile al tuo.

Il mio ricevitore rileva solo i cambiamenti di connettività, ma NON valuta lo stato di connettività. Informa lo Service invece che in entrambi i casi (connesso o meno) questo servizio avrà qualcosa da fare. Questo servizio può essere in esecuzione o meno in quel momento, in modo che si sia avviato o "informato" (ricordiamo che you can safely call startService() several times, queste chiamate non nido):

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

Poi, nel mio servizio, mi si valutano la connettività e quindi agire di conseguenza. Si noti che io non valuto lo stato della connessione allo stesso modo come si fa, e questo potrebbe essere il motivo per cui il codice qui sotto opere, ma non la tua (qui di seguito è il codice rilevante solo):

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

Questo funziona bene, sotto Android-7 (2.1) pure.

+0

Sono a conoscenza del metodo che hai usato. Tuttavia sono rimasto un po 'sorpreso dal fatto che molte persone abbiano consigliato il codice che ho usato (lo leggo anche su un libro O'reilly che ho acquistato di recente su Android!) Se non riesco a trovare una soluzione con la trasmissione CONNECTIVITY_ACTION penso che seguirò il tuo esempio e fare un controllo nel mio servizio con i metodi di ConnectivityManager. Grazie per la risposta :) – snoopaki

+0

Siete i benvenuti @snoopaki - in realtà avrei preferito venire con una soluzione usando il vostro metodo, ma semplicemente non vedo cosa sta succedendo e perché. – Shlublu

+1

In realtà ho cambiato il mio servizio in IntentService e la gestione in-service della modifica della connettività ha avuto più senso. Quindi dovrei scegliere la tua risposta come quella giusta !! grazie :) – snoopaki

2

non sappiamo circa la bandiera NO_CONNECTIVITY strano, ma è possibile recuperare la rete attiva dal intento:

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

Probabilmente si può chiamare isConnected() su questo oggetto.

+1

Grazie per la risposta, lo terrò a mente. Per il compito corrente, ho usato la risposta sopra e funziona abbastanza bene atm :) – snoopaki

+1

Questa costante è deprecata ora. –

Problemi correlati