2015-08-24 20 views
6

Sono nuovo ad Android e ho letto un libro per principianti che diceva che onSaveInstanceState(Bundle) è garantito per essere chiamato prima che il sistema recuperi il tuo Activity. L'ho provato su alcuni codici di test e l'ho trovato errato. Ho trovato che onSaveInstanceState(Bundle) è stato chiamato ogni volta che è stato chiamato onPause(). E non ha nulla a che fare con il recupero del sistema. Non ne sono molto sicuro, quindi questa è la domanda: quando si chiama in realtà onSaveInstanceState(Bundle)?Il metodo onSaveInstanceState (Bundle) viene chiamato dopo onPause()?

+0

Si dovrebbe leggere sul ciclo di vita di attività. Ecco un diagramma: http://i.stack.imgur.com/EVuKo.png – dazito

+0

Grazie, dazito. Penso di aver capito il tuo punto con l'immagine: 'onPause()' stesso è assicurato per essere chiamato prima che il sistema uccida l'attività, ecco perché anche 'onSaveInstanceState (Bundle) 'è assicurato. Ma ho notato che 'onStop()' sarà chiamato per meno volte di 'onPause()' in un ciclo di vita, e 'onStop()' è anche assicurato per essere chiamato prima che il sistema uccida l'attività. Quindi, perché 'onSaveInstanceState (Bundle)' si accoppia sempre con 'onPause()' ma non 'onStop()'? Perché "onSaveInstanceState (Bundle) dovrebbe essere chiamato così tante volte? Sembra essere una sorta di spreco di risorse per il sistema. –

+1

Poiché è possibile che un'altra attività svolga il posto (sullo schermo) dell'attività corrente, pertanto viene chiamato onPause(). Da Android Docs: 'Ad esempio, quando si apre un'attività semi-trasparente (come quella nello stile di una finestra di dialogo), l'attività precedente si interrompe. Finché l'attività è ancora parzialmente visibile ma al momento non attiva, rimane in pausa. Http://developer.android.com/training/basics/activity-lifecycle/pausing.html Ti consiglio di ignorare tutte le attività cicli di vita e gioco in modo da poter vedere come l'attività viene messa in pausa/ripresa/interrotta/distrutta ecc. – dazito

risposta

1

Secondo Android Documentation:

Inoltre, il metodo onSaveInstanceState(Bundle) viene chiamato prima di mettere l'attività in un tale stato di fondo, che consente di salvare via qualsiasi stato dell'istanza dinamica nella vostra attività nella data Bundle, a essere successivamente ricevuto in onCreate(Bundle) se l'attività deve essere ricreata. Vedere la sezione Ciclo di vita del processo per ulteriori informazioni su come il ciclo di vita di un processo è legato alle attività che sta ospitando. Si noti che è importante salvare i dati persistenti in onPause() anziché onSaveInstanceState(Bundle) poiché quest'ultimo non fa parte dei callback del ciclo di vita, quindi non verrà chiamato in tutte le situazioni come descritto nella relativa documentazione.

onPause() viene chiamato prima onSaveInstanceState(Bundle). Ma onPause() è garantito per essere chiamato come la sua parte di attività life cycle

Di solito, quando viene ricreata la vostra attività, ad esempio quando si cambia l'orientamento del dispositivo quindi onSaveInstanceState(Bundle) si chiama, se non è stato specificato il tag android:configChanges nel file manifest.xml.

2

Non sono d'accordo con una risposta precedente.
Secondo il Documentation:

Se chiamato, si verificherà questo metodo prima onStop(). Non ci sono garanzie sul fatto che si verificherà prima o dopo onPause().

+0

Come nota importante, 'onSaveInstanceState()' può essere chiamato prima di 'onPause()'. Potrebbe essere dovuto al fatto che il frammento (di supporto) che sto utilizzando si trova nel 'ViewPager'. Spero che questo sia utile per qualcun altro. – Sufian

Problemi correlati