Autore Topic: intent e onSaveInstanceState  (Letto 1631 volte)

Offline ScarfaceIII

  • Utente junior
  • **
  • Post: 112
  • Respect: +13
    • raferalston12
    • Mostra profilo
  • Dispositivo Android:
    Nexus One
  • Sistema operativo:
    GNU/Linux, Ubuntu 10.04 / Windows 7
intent e onSaveInstanceState
« il: 19 Aprile 2010, 12:22:41 CEST »
0
RISOLTO: Rispondo qui, visto che ormai ho risolto il problema.
La difficoltà che incontravo era unicamente legata al salvataggio dell'intent che fa partire il servizio. Ne avevo bisogno, dato che quando l'applicazione veniva chiusa, il Service rimaneva attivo, ma riaprendo l'applicazione, la variabile accService aveva valore null, quindi il tasto Stop non funzionava.
Ho risolto semplicemente dichiarando la variabile in globale e istanziandola all'interno del metodo onCreate. In tal modo, appena l'app viene ricaricata, passando per onCreate, il tasto Stop sarà disponibile. La soluzione della variabile booleana proposta va bene, ma solo se affiancata a questo modo di gestire l'intent, poiché per chiamare il metodo stopService(intent) è obbligatorio il controllo sull'intent.
Per quanto riguarda invece il problema del metodo onSaveInstanceState, il vincitore credo sia Qlimax, anche se, dato che non mi serve più, non ho testato l'effettivo funzionamento della soluzione proposta.

Ciao ragazzi, ho un problema riguardante il salvataggio di dati quando l'applicazione va in pausa. Spiego meglio:
la mia applicazione è composta di un'Activity e un Service, l'activity ha due pulsanti, uno fa partire il service, l'altro lo stoppa. il problema è che se faccio partire il servizio, poi pigio il tasto "indietro", il servizio rimane in running (ed è quello che voglio), l'applicazione va in pause->stop ecc, poi però, quando richiamo l'applicazione e pigio il tasto "stop" non succede niente. Il problema sorge da questo check, necessario perchè l'applicazione funzioni (se tolgo l'if, l'app mi termina con un'eccezione):

Codice (Java): [Seleziona]
   private OnClickListener stopListener = new OnClickListener() {
           public void onClick(View v){
                   if(accService != null)
                           stopService(accService);
        }
   };

Il check viene sull'intent "accService", che, se appena creato attraverso il pulsante "start", è diverso da "null", ma se l'applicazione viene mandata in pausa e poi ripresa, non ne viene mantenuta memoria e quindi, trovandolo vuoto, non succede niente! Devo infatti pigiare il pulsante start e poi il pulsante stop per fermare l'esecuzione del service.
Per ovviare a questo problema ho usato questo codice:
Codice (Java): [Seleziona]
   @Override
   protected void onSaveInstanceState(Bundle outState) {
           super.onSaveInstanceState(outState);
           outState.putParcelable(KEY, accService);
           Log.d(tag,"OnSaveInstanceState" + accService.toString());
   }

   @Override
   protected void onRestoreInstanceState(Bundle savedInstanceState) {
           super.onRestoreInstanceState(savedInstanceState);
           accService = savedInstanceState.getParcelable(KEY);
           Log.d(tag,"OnRestoreInstanceState" + accService.toString());
   }
Passando l'intent attraverso Bundle, in modo da non trovarlo nullo alla ripresa dell'applicazione, eppure il problema sussiste e stando al log, sembra che queste due funzioni non vengano chiamate!!!
Qualcuno sa spiegarmi che succede/ha dei suggerimenti?

grazie mille
« Ultima modifica: 16 Maggio 2010, 00:56:20 CEST da ScarfaceIII »

Offline Agafi

  • Utente normale
  • ***
  • Post: 173
  • Respect: +10
    • svetlana-tomasevschi-perini
    • agafist
    • Mostra profilo
  • Dispositivo Android:
    SE Xperia Neo,LG Optimus One,Asus EEE Pad Transformer,HTC Magic Vodafone
  • Play Store ID:
    Agafi
  • Sistema operativo:
    Win7
Re:intent e onSaveInstanceState
« Risposta #1 il: 19 Aprile 2010, 15:47:12 CEST »
0
provo a risponderti Scarface:

per gestire così il Service dovresti "invocarlo" in modalità bind.

In teoria se non sbaglio puoi dare degli attribuiti al service in modo che sia unico e quindi a questo punto se trovi accService ==null ti basterà istanziarlo di nuovo e subito dopo distruggerlo con lo stop...

Spero di essere stata comprensibile ;-)

Offline ScarfaceIII

  • Utente junior
  • **
  • Post: 112
  • Respect: +13
    • raferalston12
    • Mostra profilo
  • Dispositivo Android:
    Nexus One
  • Sistema operativo:
    GNU/Linux, Ubuntu 10.04 / Windows 7
Re:intent e onSaveInstanceState
« Risposta #2 il: 19 Aprile 2010, 15:54:31 CEST »
0
Ma se invoco il service in modalità bind, cesserà di esistere quando l'activity a cui è bindato cessa, cosa che io invece non voglio, ed infatti ora come ora è così:
-avvio l'app
-faccio partire il service
-esco dall'applicazione e il Service è ancora running
-rientro nell'app e stoppo il service
se faccio il bind, quando esco dall'applicazione, si stoppa anche il service...
Per quanto riguarda l'istanziarlo in modo che sia unico, è già così: se schiaccio il pulsante start mille volte non succede niente, infatti per ora ho ovviato al problema ricreando l'intent prima di fare stopService, ma è un po' una porcata...volevo un metodo per salvarmi l'intent, ma onSaveInstanceState non funziona! o_O

grazie comunque

EDIT: Ho ovviato mettendo in accService = new Intent() prima del check, ma non è esattamente "la" soluzione, dato che posso pigiare il tasto Stop a caso facendo qualcosa, quando invece non dovrebbe fare niente. Il problema che vorrei chiarirmi è perché l'intent non passa all'interno di Bundle e non posso salvarlo con onSaveInstanceState...
« Ultima modifica: 20 Aprile 2010, 19:30:54 CEST da ScarfaceIII »

Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 757
  • Respect: +203
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Galaxy Nexus - Nexus One - Wildfire - Magic
  • Play Store ID:
    egsolutions.ch
  • Sistema operativo:
    Ubuntu 12.04, Windows 7
Re:intent e onSaveInstanceState
« Risposta #3 il: 15 Maggio 2010, 19:40:22 CEST »
0
Ciao scarface,

Codice (Java): [Seleziona]
@Override
   protected void onSaveInstanceState(Bundle outState) {
           super.onSaveInstanceState(outState);
           outState.putParcelable(KEY, accService);
           Log.d(tag,"OnSaveInstanceState" + accService.toString());
   }

dovresti chiamare super.onSaveInstanceState(outState)  dopo aver inserito nel bundle il tuo intent...

Codice (Java): [Seleziona]
@Override
   protected void onSaveInstanceState(Bundle outState) {        
           outState.putParcelable(KEY, accService);
           Log.d(tag,"OnSaveInstanceState" + accService.toString());
           super.onSaveInstanceState(outState);
   }


ad ogni modo questo metodo non viene chiamato quando premi il tasto BACK, bensi viene chiamato quando l'activity passa in background (ad esempio tasto HOME).

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +507
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:intent e onSaveInstanceState
« Risposta #4 il: 15 Maggio 2010, 20:12:10 CEST »
0
A mio avviso una soluzione di questo genere non è la più corretta perchè tu non puoi a priori sapere se l'activity va in pausa oppure viene distrutta, oppure viene distrutta dopo essere andata in pausa.
Secondo me, semplicemente, potresti gestirti lo stato del servizio salvando un booleano nelle preferenze dell'app :)