2013-02-18 4 views
7

Ich habe eine Verwirrung, was in , onStop und onSaveInstanceState gehen soll. Zum Beispiel, sagen die Android docs dass für -android - Daten in onPause, onStop oder onSaveInstanceState

gespeicherte Änderungen Commit, aber nur, wenn Nutzer diese Änderungen erwarten dauerhaft gespeichert werden, wenn sie (wie ein Entwurf E-Mail) zu verlassen.

Für onStop -

Sie sollten OnStop() verwenden, größer, mehr CPU-intensive Abstellzeit Operationen auszuführen, wie zum Beispiel Informationen in eine Datenbank zu schreiben.

Für onSaveInstanceState

Ihre Aktivität könnte mehr Statusinformationen, die Sie, wie Elementvariablen wiederherstellen möchten, dass der Benutzer den Fortschritt in der Aktivität zu verfolgen.

Ist es nicht wahr, dass diese drei Dinge grundsätzlich darauf hinweisen, Informationen wie ein Formular oder eine E-Mail zu speichern? Dann in welcher Methode sollte es gespeichert werden?

Antwort

6

Alles, was Sie persistent sein möchten, muss in onPause() gespeichert werden, da einige Android-Versionen Ihre App als killbar betrachten, nachdem onPause() zurückgegeben wurde.

Die etwas unklare Unterscheidung wird gemacht, weil onPause() relativ oft auftritt, und auch unter vielen Umständen, wo Sie wahrscheinlich den Zustand für eine onResume() der gleichen Aktivität nicht speichern würden. Daher möchten alle, dass Sie zweimal überlegen, bevor Sie teure Operationen in onPause() ausführen.

Ihre Frage zum Speichern von Formulardaten, nun, Sie könnten das persistente Recht machen, wenn ein Eingabefeld den Fokus verliert, wenn es wirklich total beabsichtigt ist, dass der Benutzer dieselben Formulardaten sieht, nachdem er die App gestoppt und neu gestartet hat.

+0

'onStop()' wird garantiert seit Honeycomb (3.0) aufgerufen, was 96,8% der Android-Geräte ab Januar 2016 ausmacht. Also bevorzuge ich 'onStop()' über 'onPause()' zum Speichern von Daten jetzt. –

+0

@VickyChijwani Vom Standpunkt der Softwareentwicklung aus ist _preferring_ 'onStop()' über 'onPause()' nicht akzeptabel, es sei denn, Sie benötigen ausdrücklich Android 3.0 in den Metadaten Ihrer App (die Sie nicht erwähnen). –

+0

Richtig, ich mache meine Apps für Android 3.0 und höher, sollte das erwähnt haben.Der andere (diskutierbare) Grund, warum ich 'onStop()' bevorzuge, liegt an dieser Zeile in der ['onPause()' docs] (http://developer.android.com/reference/android/app/Activity.html#onPause % 28% 29): "Wenn Aktivität B vor Aktivität A gestartet wird, wird ... B erst erstellt, wenn A 'onPause()' zurückkehrt, also stellen Sie sicher, dass Sie hier nichts Langes tun. " Natürlich sind die Lebenszyklusdokumente insgesamt noch ziemlich verwirrend, daher ist dies nicht schlüssig. –

2

Für alle, die in oder nach 2016 kommen, beachten Sie, dass die Antwort von @Class Stacker an diesem Punkt ziemlich veraltet ist. Insbesondere wird onStop() garantiert seit Android 3.0 (Honeycomb) genannt werden, die für 96.8% of Android devices ab Januar 2016. Konten

hier den Lebenszyklus der Dokumentation zur: http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle (Strg + F für „nicht im angreifbar Zustand“)

UPDATE: wie zu Recht in den Kommentaren darauf hingewiesen, bedeutet dies natürlich, dass Ihre App ausschließlich auf Android 3.0 und höher beschränkt sein muss.

+0

Um dies noch einmal deutlich zu machen (auch oben erwähnt), ist der Prozentsatz selbst kein ausreichender Punkt. Eine App, die Persistenz in 'onPause()' nicht anspricht, muss streng auf Android 3 und höher beschränkt sein. –