Próbuję zapisać i przywrócić stan pliku Activity
przy użyciu metod onSaveInstanceState()
i onRestoreInstanceState()
.
Problem w tym, że nigdy nie wchodzi do onRestoreInstanceState()
metody. Czy ktoś może mi wyjaśnić, dlaczego tak jest?
android
android-activity
states
BlaBRA
źródło
źródło
Odpowiedzi:
Zwykle przywracasz swój stan w
onCreate()
. Można goonRestoreInstanceState()
również przywrócić , ale niezbyt często. (onRestoreInstanceState()
nazywa się poonStart()
, aonCreate()
nazywa się przedonStart()
.Użyj metod put do przechowywania wartości w
onSaveInstanceState()
:I przywróć wartości w
onCreate()
:źródło
onRestoreInstanceState()
jest wywoływana tylko podczas odtwarzania aktywności po jej zabiciu przez system operacyjny. Taka sytuacja ma miejsce, gdy:W przeciwieństwie do tego: jeśli jesteś w swojej aktywności i naciśniesz
Back
przycisk na urządzeniu, Twoja aktywność zostanie zakończona () ed (tj. Pomyśl o tym jak o wyjściu z aplikacji komputerowej) i następnym razem, gdy uruchomisz aplikację, zostanie uruchomiona „od nowa”, tj. Bez zapisany stan, ponieważ celowo opuściłeś go po uderzeniuBack
.Innym źródłem nieporozumień jest to, że gdy aplikacja traci fokus na inną aplikację,
onSaveInstanceState()
jest wywoływana, ale po powrocie do aplikacjionRestoreInstanceState()
może nie zostać wywołana. Tak jest w przypadku opisanym w pierwotnym pytaniu, tj. Jeśli twoja czynność NIE została zabita w okresie, gdy inna czynność była z przoduonRestoreInstanceState()
, NIE zostanie wywołana, ponieważ twoja aktywność jest prawie „żywa”.Podsumowując, jak podano w dokumentacji
onRestoreInstanceState()
:Tak jak to przeczytałem: nie ma powodu do nadpisywania,
onRestoreInstanceState()
chyba że tworzysz podklasęActivity
i oczekuje się, że ktoś podklasuje twoją podklasę.źródło
Stan, w którym zapisujesz,
onSaveInstanceState()
jest później dostępny podczasonCreate()
wywołania metody. Dlatego użyjonCreate
(i jegoBundle
parametru), aby przywrócić stan swojej aktywności.źródło
Aby obejść ten problem, możesz przechowywać pakiet z danymi, które chcesz zachować, w zamiarze, którego używasz do rozpoczęcia działania A.
Działanie A musiałoby przekazać to z powrotem do działania B. Możesz pobrać intencję w metodzie onCreate działania B.
Innym pomysłem jest utworzenie klasy repozytorium do przechowywania stanu aktywności i umieszczenie każdego z twoich działań w odniesieniu do tej klasy (możliwe przy użyciu struktury singleton). Jednak zrobienie tego prawdopodobnie jest bardziej kłopotliwe niż warte.
źródło
Najważniejsze jest to, że jeśli nie przechowywać w
onSaveInstanceState()
czymonRestoreInstanceState()
nie zostanie wywołana. To jest główna różnica międzyrestoreInstanceState()
ionCreate()
. Upewnij się, że naprawdę coś przechowujesz. Najprawdopodobniej to twój problem.źródło
Zauważyłem, że onSaveInstanceState jest zawsze wywoływana, gdy na pierwszym planie pojawia się inne działanie. I tak jest onStop.
Jednak onRestoreInstanceState została wywołana tylko wtedy, gdy wywołano również onCreate i onStart. A onCreate i onStart NIE zawsze były wywoływane.
Wygląda więc na to, że Android nie zawsze usuwa informacje o stanie, nawet jeśli działanie jest przenoszone w tle. Jednak wywołuje metody cyklu życia, aby zapisać stan tylko dla bezpieczeństwa. Dlatego jeśli stan nie zostanie usunięty, system Android nie wywoła metod cyklu życia w celu przywrócenia stanu, ponieważ nie są one potrzebne.
Rysunek 2 to opisuje.
źródło
Myślę, że ten wątek był dość stary. Wspomnę tylko o innym przypadku, który
onSaveInstanceState()
również zostanie wywołany, to kiedy zadzwoniszActivity.moveTaskToBack(boolean nonRootActivity)
.źródło
Jeśli obsługujesz zmiany orientacji działania za pomocą
android:configChanges="orientation|screenSize"
ionConfigurationChanged(Configuration newConfig)
,onRestoreInstanceState()
nie zostanie wywołany.źródło
Nie jest konieczne, aby onRestoreInstanceState zawsze był wywoływany po onSaveInstanceState.
Zwróć uwagę, że: onRestoreInstanceState będzie zawsze wywoływane, gdy aktywność zostanie obrócona (gdy orientacja nie jest obsługiwana) lub otworzy Twoją aktywność, a następnie otwórz inne aplikacje, aby instancja aktywności została wyczyszczona z pamięci przez system operacyjny.
źródło
Z dokumentacji Przywróć stan interfejsu użytkownika aktywności przy użyciu zapisanego stanu instancji jest to:
IMO, to jest bardziej przejrzysty sposób niż sprawdzanie tego w onCreate i lepiej pasuje do zasady pojedynczej odpowiedzialności.
źródło
W moim przypadku
onRestoreInstanceState
został wywołany, gdy czynność została zrekonstruowana po zmianie orientacji urządzenia.onCreate(Bundle)
został wywołany jako pierwszy, ale pakiet nie miał klucza / wartości, który ustawiłemonSaveInstanceState(Bundle)
.Zaraz potem
onRestoreInstanceState(Bundle)
został wywołany z pakietem, który miał poprawne klucze / wartości.źródło
Właśnie wpadłem na to i zauważyłem, że dokumentacja zawiera moją odpowiedź:
„Ta funkcja nigdy nie zostanie wywołana ze stanem zerowym”.
https://developer.android.com/reference/android/view/View.html#onRestoreInstanceState(android.os.Parcelable)
W moim przypadku zastanawiałem się, dlaczego onRestoreInstanceState nie jest wywoływany podczas początkowej instancji. Oznacza to również, że jeśli nic nie zapiszesz, nie zostanie to wywołane, gdy przejdziesz do rekonstrukcji widoku.
źródło
Mogę to zrobić (przepraszam, że to nie java, ale to nie jest problem ...):
I W TWOJEJ DZIAŁALNOŚCI DLA REZULTATU
WRESZCIE
źródło