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()?
risposta
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 inonCreate(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 inonPause()
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.
Sì 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
.
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().
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
- 1. Come recuperare il bundle onSaveInstanceState() in onResume()?
- 2. Il frammento di onSaveInstanceState() non viene mai chiamato
- 3. Cosa viene chiamato dopo il metodo onConfigurationchanged()
- 4. onSaveInstanceState non viene richiamato dopo la rotazione dello schermo
- 5. Android: scenario in cui viene chiamato onPause ma non onStop?
- 6. Dove viene salvato il pacchetto di onSaveInstanceState?
- 7. viewDidLoad viene chiamato prima il metodo init tutto viene eseguito
- 8. Perché il metodo oncreate viene chiamato dopo startActivityForResult?
- 9. Android Visualizza onSaveInstanceState non chiamato
- 10. android - dati memorizzati in onPause, onStop o onSaveInstanceState
- 11. Cosa viene chiamato dopo "onConfigurationChanged()"?
- 12. Il metodo onActivityResult non viene chiamato Android
- 13. Bundle in onActivityCreated() restituisce null, anche dopo aver impostato i valori in onSaveInstanceState()
- 14. Metodo onHandleIntent() non viene chiamato
- 15. WebView: Il metodo WebViewClient.onPageStarted non viene chiamato
- 16. Il metodo Mailer non viene chiamato?
- 17. Quando viene chiamato il metodo layoutSubviews?
- 18. Il metodo virtuale non viene chiamato
- 19. Quando viene chiamato il metodo IEnumerator.Reset()?
- 20. UICollectionReusableView non viene chiamato il metodo
- 21. Cosa succede dopo che un metodo viene chiamato in Java
- 22. Cosa succede a AsyncTasks dopo onPause?
- 23. Il metodo onPreferenceChange non viene chiamato quando si modifica Listpreferences
- 24. Dopo la rotazione, onCreate() Frammento viene chiamato prima onCreate() FragmentActivity
- 25. onPageScrolled() non viene chiamato
- 26. Quando viene chiamato il metodo onCreate di SQLiteOpenHelper?
- 27. Il metodo onDraw() di SurfaceView esteso non viene mai chiamato
- 28. iOS - viewController Il metodo dealloc non viene chiamato dopo il popping alla vista precedenteController
- 29. Perché CursorLoader onLoaderReset() viene chiamato dopo la rotazione del dispositivo?
- 30. OnSaveInstanceState con Singleton
Si dovrebbe leggere sul ciclo di vita di attività. Ecco un diagramma: http://i.stack.imgur.com/EVuKo.png – dazito
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. –
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