Autore Topic: Come faccio a controllare lo stato della rete ogni "qualche" secondo?  (Letto 866 volte)

Offline lupin0734

  • Nuovo arrivato
  • *
  • Post: 20
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note II - GT-N7100
  • Sistema operativo:
    Mac OS X 10.9
Buongiorno e buon inizio di settimana a tutti ragazzi.
Io sto facendo un applicazione che all'avvio scarica un xml e qualche immagine per "disegnare" dei marker su di una mappa. Ho gestito tutti i vari casi in cui si potrebbe trovare il device: telefono con connessione, senza, con gps acceso o meno. Ma ho un caso che non riesco a gestire, cioè quando l'utente che ha appena scaricato l'applicazione la lancia per la prima volta senza internet acceso. Come faccio a far capire ad android che è il primo avvio dell'app? Esiste un ipotetico metodo "OnFirstStart"?

Un'altra cosa; come faccio a controllare ogni "n" secondi lo stato della rete? Mi spiego meglio: Se l'app non ha l'xml offline, viene fuori un popup che dice per favore accendi la rete. L'utente la accende, torna sull'app e finché non si reinizializza l'activity l'app non mi scarica il file xml e non disegna i punti sulla mappa. Come faccio a far capire all'app che l'utente ha abilitato internet (magari semplicemente dopo aver abbassato il menù a tendina per abilitare internet dai toggles)  e quando torna nell'app, questa deve ricaricare l'activity? Mi servirebbe un controllo che ogni ... boh 2 secondi controlla se lo stato di internet da spento è diventato acceso. Se questo è accaduto, fermo questa funzione e ricarico l'activity per disegnare i punti.

Grazie a tutti in anticipo

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Come faccio a controllare lo stato della rete ogni "qualche" secondo?
« Risposta #1 il: 29 Settembre 2014, 10:24:17 CEST »
+1
Buongiorno e buon inizio di settimana a tutti ragazzi.
Io sto facendo un applicazione che all'avvio scarica un xml e qualche immagine per "disegnare" dei marker su di una mappa. Ho gestito tutti i vari casi in cui si potrebbe trovare il device: telefono con connessione, senza, con gps acceso o meno. Ma ho un caso che non riesco a gestire, cioè quando l'utente che ha appena scaricato l'applicazione la lancia per la prima volta senza internet acceso. Come faccio a far capire ad android che è il primo avvio dell'app? Esiste un ipotetico metodo "OnFirstStart"?

Tutte le volte che avvii l'app controlla nelle SharedPreferences se è presente un certo flag. La prima volta non ci sarà e quindi la considera prima volta, e imposti quel flag, così le volte successive ci sarà.

Un'altra cosa; come faccio a controllare ogni "n" secondi lo stato della rete? Mi spiego meglio: Se l'app non ha l'xml offline, viene fuori un popup che dice per favore accendi la rete. L'utente la accende, torna sull'app e finché non si reinizializza l'activity l'app non mi scarica il file xml e non disegna i punti sulla mappa. Come faccio a far capire all'app che l'utente ha abilitato internet (magari semplicemente dopo aver abbassato il menù a tendina per abilitare internet dai toggles)  e quando torna nell'app, questa deve ricaricare l'activity? Mi servirebbe un controllo che ogni ... boh 2 secondi controlla se lo stato di internet da spento è diventato acceso. Se questo è accaduto, fermo questa funzione e ricarico l'activity per disegnare i punti.

Un modo semplice è usare AlarmManager per far eseguire codice specifico a scadenze prefissate, una o più volte.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline lillogoal

  • Utente normale
  • ***
  • Post: 167
  • Respect: +4
    • Google+
    • lillosogliani
    • Mostra profilo
    • LilloNet
  • Dispositivo Android:
    Galaxy s3, Nexus 7,galaxy s advance,galaxy scl
  • Play Store ID:
    Lillonet Inc.
  • Sistema operativo:
    Windows 8,7 & Kali-Linux
Re:Come faccio a controllare lo stato della rete ogni "qualche" secondo?
« Risposta #2 il: 29 Settembre 2014, 10:50:27 CEST »
0
Seguo il post perché' sono interessato anche io all'alarm manager
Chi non progetta la sicurezza , programma il fallimento! K.M

Offline lupin0734

  • Nuovo arrivato
  • *
  • Post: 20
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note II - GT-N7100
  • Sistema operativo:
    Mac OS X 10.9
Re:Come faccio a controllare lo stato della rete ogni "qualche" secondo?
« Risposta #3 il: 30 Settembre 2014, 09:11:27 CEST »
0
Ciao ragazzi, scusate se non vi ho risposto ma sono stato indaffarato in altre robe ieri. Ho trovato una cosa che è più intuitiva degli alarm manager che di per se però non sono un approccio sbagliato. Si chiama Broadcast receiver ed è un "ricevitore" che è sempre in attesa del cambio di stato di connessione. Di seguito vi metto il codice:

Codice (Java): [Seleziona]
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.util.Log;
import android.view.View;

public class NetworkStateReceiver extends BroadcastReceiver {
       
       
   
        private static final String TAG = "NetworkStateReceiver";
        @Override
       
    public void onReceive(final Context context, final Intent intent) {

        Log.d(TAG, "Network connectivity change");

        if (intent.getExtras() != null) {
            final ConnectivityManager connectivityManager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
            final NetworkInfo ni = connectivityManager.getActiveNetworkInfo();
           
            if (ni != null && ni.isConnectedOrConnecting()) {
                Log.i(TAG, "Network " + ni.getTypeName() + " connected");
               
                } else if (intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, Boolean.FALSE)) {
                Log.d(TAG, "There's no network connectivity");
            }
        }
    }
       
       
}

e questo va nel manifest dentro <application>:

Codice (XML): [Seleziona]
<receiver android:name="com.example.findmyclients.NetworkStateReceiver">
            <intent-filter>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
            </intent-filter>
         </receiver>

Il mio problema è ora che avendo fatto un'altra classe per il Broadcast Receiver, da questa nuova classe non riesco a ricaricare il MainActivity. Cioè se uno parte con l'app con la connessione spenta, quest'ultima gli richiede di accendere la connessione, lui la accende, e a quel punto dovrei ricaricare l'activity ma non ci riesco :/. Ho anche visto col debugger che nell'if del broadcast receiver ci va e stampa nel log connessione wifi attiva o connessione 3g attiva.. quindi dovrei mettere li dentro un qualcosa che riavvii l'activity. Ho provato con il classico intent e startActivity ma non c'è nulla da fare :(

Offline lillogoal

  • Utente normale
  • ***
  • Post: 167
  • Respect: +4
    • Google+
    • lillosogliani
    • Mostra profilo
    • LilloNet
  • Dispositivo Android:
    Galaxy s3, Nexus 7,galaxy s advance,galaxy scl
  • Play Store ID:
    Lillonet Inc.
  • Sistema operativo:
    Windows 8,7 & Kali-Linux
Re:Come faccio a controllare lo stato della rete ogni "qualche" secondo?
« Risposta #4 il: 30 Settembre 2014, 09:38:36 CEST »
0
Non ho capito il tuo problema... vorresti riavviare l'activity?
Chi non progetta la sicurezza , programma il fallimento! K.M

Offline lupin0734

  • Nuovo arrivato
  • *
  • Post: 20
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note II - GT-N7100
  • Sistema operativo:
    Mac OS X 10.9
Re:Come faccio a controllare lo stato della rete ogni "qualche" secondo?
« Risposta #5 il: 30 Settembre 2014, 09:41:09 CEST »
0
Si semplicemente perché una volta che accendo la connessione, l'app dovrebbe andare a prendermi un file xml sul server senza chiudere e riaprire l'app (penso che sia l'equivalente di ricaricare l'activity)

Offline lillogoal

  • Utente normale
  • ***
  • Post: 167
  • Respect: +4
    • Google+
    • lillosogliani
    • Mostra profilo
    • LilloNet
  • Dispositivo Android:
    Galaxy s3, Nexus 7,galaxy s advance,galaxy scl
  • Play Store ID:
    Lillonet Inc.
  • Sistema operativo:
    Windows 8,7 & Kali-Linux
Re:Come faccio a controllare lo stato della rete ogni "qualche" secondo?
« Risposta #6 il: 30 Settembre 2014, 10:09:39 CEST »
0
Che istruzione hai usato?
Chi non progetta la sicurezza , programma il fallimento! K.M

Offline lupin0734

  • Nuovo arrivato
  • *
  • Post: 20
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note II - GT-N7100
  • Sistema operativo:
    Mac OS X 10.9
Re:Come faccio a controllare lo stato della rete ogni "qualche" secondo?
« Risposta #7 il: 30 Settembre 2014, 10:36:15 CEST »
0
Il classico Intent nomeintent = new Intent ... poi startActivity(intent);

Offline lillogoal

  • Utente normale
  • ***
  • Post: 167
  • Respect: +4
    • Google+
    • lillosogliani
    • Mostra profilo
    • LilloNet
  • Dispositivo Android:
    Galaxy s3, Nexus 7,galaxy s advance,galaxy scl
  • Play Store ID:
    Lillonet Inc.
  • Sistema operativo:
    Windows 8,7 & Kali-Linux
Re:Come faccio a controllare lo stato della rete ogni "qualche" secondo?
« Risposta #8 il: 30 Settembre 2014, 10:59:03 CEST »
0
Intent i = new Intent (getContext (), nome.class);
startActivity(i);

Magari non va bene getContext ora non sono a casa poi guardo. Oppure manda un messaggio al'activity e aggiornala
Chi non progetta la sicurezza , programma il fallimento! K.M

Offline lupin0734

  • Nuovo arrivato
  • *
  • Post: 20
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note II - GT-N7100
  • Sistema operativo:
    Mac OS X 10.9
Re:Come faccio a controllare lo stato della rete ogni "qualche" secondo?
« Risposta #9 il: 30 Settembre 2014, 11:01:40 CEST »
0
Il fatto è proprio questo.. non posso fare startActivity da una classe che non estende activity :/

Offline lillogoal

  • Utente normale
  • ***
  • Post: 167
  • Respect: +4
    • Google+
    • lillosogliani
    • Mostra profilo
    • LilloNet
  • Dispositivo Android:
    Galaxy s3, Nexus 7,galaxy s advance,galaxy scl
  • Play Store ID:
    Lillonet Inc.
  • Sistema operativo:
    Windows 8,7 & Kali-Linux
Re:Come faccio a controllare lo stato della rete ogni "qualche" secondo?
« Risposta #10 il: 30 Settembre 2014, 11:04:49 CEST »
0
Ho un'idea... prova ad inviare un messaggio all'activity e se ricevi quel tipo di messaggio... aggiorni l'activity o scsrichi l'xml dopo ti scrivo il sorgente... intanto dimmi se hai capito. Io questo metodo l'avevo provato con i service ma penso vada bene pure per questo
Chi non progetta la sicurezza , programma il fallimento! K.M

Offline lupin0734

  • Nuovo arrivato
  • *
  • Post: 20
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note II - GT-N7100
  • Sistema operativo:
    Mac OS X 10.9
Re:Come faccio a controllare lo stato della rete ogni "qualche" secondo?
« Risposta #11 il: 30 Settembre 2014, 11:16:24 CEST »
0
Grazie mille, ho capito ma avevo fatto una roba simile. Io avevo messo un metodo prova dentro al main activity che richiamavo se veniva cambiato lo stato di connessione. E tutto andava bene solamente che se richiamavo il metodo che mi interessava mi dava un errore del metodo di connessione http ... una roba strana. Oppure potrei da quel metodo di prova refreshare l'activity dato che si trova proprio al suo interno. Il problema è che non ho la minima idea di come si faccia :(

Offline lillogoal

  • Utente normale
  • ***
  • Post: 167
  • Respect: +4
    • Google+
    • lillosogliani
    • Mostra profilo
    • LilloNet
  • Dispositivo Android:
    Galaxy s3, Nexus 7,galaxy s advance,galaxy scl
  • Play Store ID:
    Lillonet Inc.
  • Sistema operativo:
    Windows 8,7 & Kali-Linux
Re:Come faccio a controllare lo stato della rete ogni "qualche" secondo?
« Risposta #12 il: 30 Settembre 2014, 11:36:51 CEST »
0
Ok  perfetto... dopo provo a scrivertelo. Appena torno
Chi non progetta la sicurezza , programma il fallimento! K.M

Offline lupin0734

  • Nuovo arrivato
  • *
  • Post: 20
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note II - GT-N7100
  • Sistema operativo:
    Mac OS X 10.9
Re:Come faccio a controllare lo stato della rete ogni "qualche" secondo?
« Risposta #13 il: 30 Settembre 2014, 11:38:59 CEST »
0
Grazie mille guarda...spero mi salverai la vita oggi !! Confido in te !

Offline lillogoal

  • Utente normale
  • ***
  • Post: 167
  • Respect: +4
    • Google+
    • lillosogliani
    • Mostra profilo
    • LilloNet
  • Dispositivo Android:
    Galaxy s3, Nexus 7,galaxy s advance,galaxy scl
  • Play Store ID:
    Lillonet Inc.
  • Sistema operativo:
    Windows 8,7 & Kali-Linux
Re:Come faccio a controllare lo stato della rete ogni "qualche" secondo?
« Risposta #14 il: 30 Settembre 2014, 12:48:02 CEST »
0
Questo nel broadcast
Codice (Java): [Seleziona]
 LocalBroadcastManager broadcaster = LocalBroadcastManager.getInstance(NavActivity.mActivity);

        sendMessage("attiva_notifica");

    }
    private void sendMessage(String str) {

        Intent intent = new Intent("custom-event-name");
        // You can also include some extra data.
        intent.putExtra("message", str);
        LocalBroadcastManager.getInstance(NavActivity.mActivity).sendBroadcast(intent);
    }
Questo va nell'onCreate o onResume
Codice (Java): [Seleziona]
LocalBroadcastManager.getInstance(getActivity()).registerReceiver(mMessageReceiver,new IntentFilter("custom-event-name"));
Nell'activity metti:
Codice (Java): [Seleziona]
private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String message = intent.getStringExtra("message");

            if(message.equals("messaggio"))
            {
                       
             }
        }
    };

te l'ho scritto velocemente.... fammi sapere se funziona se no troviamo altre soluzioni
Chi non progetta la sicurezza , programma il fallimento! K.M