Autore Topic: IntentService che si arresta da solo?  (Letto 808 volte)

Offline volpesfuggente

  • Nuovo arrivato
  • *
  • Post: 12
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Sistema operativo:
    KitKat 4.4.2
IntentService che si arresta da solo?
« il: 27 Agosto 2013, 10:34:45 CEST »
0
Ciao a tutti,
sto sviluppando un'app che lancia un IntentService per la raccolta in background di dati provenienti da uno dei sensori dello smartphone.
Il servizio lanciato, non dovrebbe arrestarsi mai, almeno finché non gli viene comandato esplicitamente.
Periodicamente (ogni tot secondi) acquisisce una nuova lettura e la scrive nel DB.
Sembra funzionare abbastanza bene, solo che a volte capita (soprattutto quando lascio il servizio attivo per molto tempo, diciamo una giornata) mi accorgo che la raccolta di dati si era arrestata e infatti quando riapro la mia app, mi compare il messaggio di riavvio del servizio (mi faccio restituire un TOAST ogni volta che chiama il metodo onCreate dell'IntentService). Tale metodo inoltre è stato configurato per ripartire autonomamente ogni volta che il servizio viene arrestato per qualche motivo (START_REDELIVER_INTENT), solo che non sembra funzionare (o almeno non sempre).

Qualche suggerimento?

Offline MisterAnt

  • Utente normale
  • ***
  • Post: 272
  • Respect: +4
    • IlSikano
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S4 Active,Galaxy SIII I9300, Galaxy Tab GT-P5100
  • Play Store ID:
    MisterAnt
  • Sistema operativo:
    Ubuntu 12.04/Winzoz 7/Winzoz xp
Re:IntentService che si arresta da solo?
« Risposta #1 il: 27 Agosto 2013, 10:39:20 CEST »
0
Prova a postare il codice del Servizio...
Magari sbagli a passargli qualche valore
Se le zampe del coniglio sono così fortunate, che fine ha fatto il coniglio?

Offline volpesfuggente

  • Nuovo arrivato
  • *
  • Post: 12
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Sistema operativo:
    KitKat 4.4.2
Re:IntentService che si arresta da solo?
« Risposta #2 il: 27 Agosto 2013, 10:58:00 CEST »
0
Prova a postare il codice del Servizio...
Magari sbagli a passargli qualche valore


Nel metodo onCreate() della classe main creo il servizio:

Codice (Java): [Seleziona]
public Intent intent =null;

public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      Intent intent = new Intent(this, HelloIntentService.class);        

      .....
}



Poi nel metodo che cattura l'evento onClick del Button, lancio il servizio:

Codice (Java): [Seleziona]
startService(intent);

Questa è la classe del servizio:
Codice (Java): [Seleziona]
public class HelloIntentService extends IntentService implements SensorEventListener{

       
        private SensorManager sensorManager = null;
        private DatabaseHandler db = new DatabaseHandler(this);
       
        public boolean hasStopped=false;
       
       
          public HelloIntentService() {
              super("HelloIntentService");
          }

          @Override
          public int onStartCommand(Intent intent, int flags, int startId) {
                  Toast.makeText(this, "service starting", Toast.LENGTH_SHORT).show();
                  super.onStartCommand(intent,flags,startId);

                  hasStopped=false;
                 
                  sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);  

                  return START_REDELIVER_INTENT;
          }

          @Override
          public void onDestroy() {
                  this.stopSelf();
                  hasStopped=true;
                  sensorManager.unregisterListener(this);
                 
                  Toast.makeText(this, "service destroyed", Toast.LENGTH_SHORT).show();                  
                 
                  super.onDestroy();
          }
         

          @Override
          protected void onHandleIntent(Intent intent) {             
                           
              while (!hasStopped) {
                 synchronized (this) {
                      try {      
                       
                         
                                 
                                  // Collect the values from the sensor
                                  ....
                                  ....

                                  wait(5000);
                         
                       
                      } catch (Exception e) {
                     }
                  }
              }
          }
}

Offline MisterAnt

  • Utente normale
  • ***
  • Post: 272
  • Respect: +4
    • IlSikano
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S4 Active,Galaxy SIII I9300, Galaxy Tab GT-P5100
  • Play Store ID:
    MisterAnt
  • Sistema operativo:
    Ubuntu 12.04/Winzoz 7/Winzoz xp
Re:IntentService che si arresta da solo?
« Risposta #3 il: 27 Agosto 2013, 11:06:05 CEST »
0
Guarda le differenze tra service e intentservice....
Trad. da inglese XD

"Servizio"---->Un servizio è un componente dell'applicazione che rappresentano sia il desiderio di una domanda per effettuare una operazione a più lungo in esecuzione mentre non interagire con l'utente o per la fornitura di funzionalità di altre applicazioni da utilizzare.

"IntentService"----> IntentService è una classe di base per i servizi che gestiscono le richieste asincrone (espressi come Intenti) su richiesta. I client inviano le richieste attraverso StartService (Intent) chiama, il servizio viene avviato, se necessario, gestisce ogni intento a sua volta utilizzando un thread di lavoro, e si arresta quando si esaurisce di lavoro.
Se le zampe del coniglio sono così fortunate, che fine ha fatto il coniglio?

Offline Giak

  • Utente junior
  • **
  • Post: 52
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    transformer tf101
  • Sistema operativo:
    ubuntu 12.10
Re:IntentService che si arresta da solo?
« Risposta #4 il: 27 Agosto 2013, 12:07:34 CEST »
0
devi usare un service non un intentservice e in più ricordati di avviarlo con il flag per il START_STICKY

Offline volpesfuggente

  • Nuovo arrivato
  • *
  • Post: 12
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Sistema operativo:
    KitKat 4.4.2
Re:IntentService che si arresta da solo?
« Risposta #5 il: 27 Agosto 2013, 13:13:47 CEST »
0
Ok, vi ringrazio per i consigli, stasera provo se funziona e vi faccio sapere  ;-)

Offline Crastino3

  • Nuovo arrivato
  • *
  • Post: 3
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    samsung galaxy wonder
  • Sistema operativo:
    Debian 7.0
Re:IntentService che si arresta da solo?
« Risposta #6 il: 09 Dicembre 2013, 23:29:12 CET »
0
ciao, alla fine hai risolto il problema usando un service?

Perché io ho letto che l'IntentService è più facile da implementare ma soprattutto che il Service lavora sul main thread e se io ho bisogno di usare l'activity mentre il service lavora in background creerebbe problemi.

giusto?