Co się dziejeCreate (pakiet zapisanyInstanceState)


Odpowiedzi:


106

Jeśli zapiszesz stan aplikacji w pakiecie (zwykle nietrwałe, dynamiczne dane w onSaveInstanceState), można go przekazać z powrotem, onCreatejeśli działanie musi zostać odtworzone (np. Zmiana orientacji), aby nie utracić tego wcześniej Informacja. Jeśli nie podano żadnych danych, savedInstanceStatema wartość null.

... powinieneś użyć metody onPause (), aby zapisać wszelkie trwałe dane (takie jak zmiany użytkownika) do pamięci. Ponadto metoda onSaveInstanceState (Bundle) jest wywoływana przed umieszczeniem aktywności w takim stanie tła, co pozwala na zapisanie dowolnego stanu dynamicznej instancji w danej aktywności w danym pakiecie, aby później został odebrany w onCreate (Bundle), jeśli aktywność musi zostać odtworzony. Zobacz sekcję Cykl życia procesu, aby uzyskać więcej informacji o tym, jak cykl życia procesu jest powiązany z działaniami, które obsługuje. Zauważ, że ważne jest, aby zapisywać trwałe dane w onPause () zamiast onSaveInstanceState (Bundle), ponieważ ta ostatnia nie jest częścią wywołań zwrotnych cyklu życia, więc nie będzie wywoływana w każdej sytuacji, jak opisano w dokumentacji.

źródło


2
czy inne działania mają ten sam pakiet?, czy jeśli rozpocznę inną aktywność, przejdzie przez ten pakiet z pierwszego?
Francisco Corrales Morales

17

onCreate(Bundle savedInstanceState)otrzymasz Bundlewartość null, gdy aktywność zostanie rozpoczęta po raz pierwszy i będzie używana, gdy orientacja aktywności zostanie zmieniona .......

http://www.gitshah.com/2011/03/how-to-handle-screen-orientation_28.html

Android zapewnia inny elegancki sposób osiągnięcia tego. Aby to osiągnąć, musimy zastąpić metodę o nazwie onSaveInstanceState(). Platforma Android umożliwia użytkownikom zapisywanie stanu dowolnej instancji. Stan instancji można zapisać w paczce. Pakiet jest przekazywany jako argument do metody onSaveInstanceState.

możemy załadować stan zapisanej instancji z pakietu przekazanego jako argument do onCreatemetody. Możemy również wczytać stan zapisanej instancji w onRestoreInstanceStatemetodzie. Ale zostawię to czytelnikom, aby zrozumieli.


11
savedInstanceStatenie będzie, nulljeśli onSavedInstanceState()został wcześniej wywołany. zmiany orientacji to tylko jeden przykład, w którym może to nastąpić.
Alex Lockwood

1
@AlexLockwood, próbuję wymyślić wszystkie sytuacje, w których może to mieć miejsce. Czy jest jakaś dokumentacja? Jednym z przykładów, o których przychodzi mi do głowy, jest sytuacja, gdy użytkownik przełącza aplikacje i wraca, ale aktywność została zniszczona w celu odzyskania zasobów. W takim przypadku Android ponownie utworzy działanie z pakietem, jeśli onSaveInsanceState () został zastąpiony, prawda?
batbrat

1
@batbrat Tak ... komentarz, który napisałem (prawie dwa lata temu) nie jest do końca poprawny. Myślę, że najlepszym sposobem, aby to ująć, jest Bundleargument, że onCreate(Bundle)będzie non- nullif i tylko wtedy, gdy wcześniej została wywołana Activityjego onSaveInstanceStatemetoda. Dzieje się tak podczas zmian orientacji ... a także dzieje się, gdy aktywność powraca po jej zabiciu przez system operacyjny i gdy wywołujesz jakąkolwiek inną zmianę konfiguracji na urządzeniu.
Alex Lockwood

Dzięki za wyjaśnienie Alex. Dobrze jest mieć jasność na ten temat. Zapomniałem o zmianach konfiguracji innych niż w szczególności przełączniki orientacji.
batbrat

15

Jak odpowiedział Dhruv Gairola, możesz zapisać stan aplikacji, korzystając z opcji Pakiet zapisanyInstanceState. Staram się podać bardzo prosty przykład, który nowi uczniowie, tacy jak ja, mogą z łatwością zrozumieć.

Załóżmy, że masz prosty fragment z TextView i Button. Po każdym kliknięciu przycisku tekst się zmienia. Teraz zmień orientację swojego urządzenia / emulatora i zwróć uwagę, że utraciłeś dane (oznacza to zmienione dane po kliknięciu, które otrzymałeś), a fragment zaczyna się ponownie za pierwszym razem. Korzystając z Bundle SavedInstanceState możemy się tego pozbyć. Jeśli spojrzysz na cykl życia fragmentu. Fragment Lifecylce Otrzymasz , że metoda „onSaveInstanceState” jest wywoływana, gdy fragment ma zostać zniszczony.

Więc możemy zapisać stan, który oznacza zmienioną wartość tekstową w tym pakiecie w ten sposób

 int counter  = 0;
 @Override
 public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putInt("value",counter);
 }

Po dokonaniu orientacji metoda „onCreate” zostanie wywołana, prawda? więc możemy to zrobić

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if(savedInstanceState == null){
        //it is the first time the fragment is being called
        counter = 0;
    }else{
        //not the first time so we will check SavedInstanceState bundle
        counter = savedInstanceState.getInt("value",0); //here zero is the default value
    }
}

Teraz po orientacji nie stracisz na wartości. Zmieniona wartość będzie zawsze wyświetlana.


Zauważ, że dotyczy to również Aktywności. Czy możesz wyjaśnić więcej na temat różnicy między (Bundle of Activity) a Bundle of Fragment?
laalaguer

Możesz uzyskać wyraźne zrozumienie na podstawie cykli życia działania i fragmentu, w którym działanie może wyświetlać wiele fragmentów naraz. Podstawowa różnica polega więc na tym, że możesz chcieć zachować pewne wartości dla wszystkich fragmentów działania, wtedy będziesz użyj pakietu aktywności, w przeciwnym razie powinieneś użyć pakietu fragmentu, jeśli dotyczy określonego fragmentu.
Asad

5

Funkcja onCreate (pakiet zapisanyInstanceState) w systemie Android:

1) Gdy działanie zostało po raz pierwszy wywołane lub uruchomione, metoda onCreate (Bundle saveInstanceState) jest odpowiedzialna za utworzenie działania.

2) Kiedy kiedykolwiek orientacja (tj. Z poziomej na pionową lub pionową na poziomą) aktywności zostanie zmieniona lub gdy działanie zostanie wymuszone przez dowolny system operacyjny, wtedy saveInstanceState, czyli obiekt klasy pakietu zapisze stan działania.

3) Po zmianie orientacji onCreate (Bundle allowedInstanceState) wywoła i odtworzy działanie oraz załaduje wszystkie dane z saveInstanceState.

4) Zasadniczo klasa Bundle służy do przechowywania danych o aktywności, gdy powyższy warunek wystąpi w aplikacji.

5) onCreate () nie jest wymagany dla aplikacji. Ale powodem, dla którego jest używana w aplikacji, jest to, że ta metoda jest najlepszym miejscem do umieszczenia kodu inicjującego.

6) Możesz również umieścić swój kod inicjalizacyjny w onStart () lub onResume (), a kiedy aplikacja zostanie załadowana jako pierwsza, będzie działać tak samo jak w onCreate ().


4

onCreate(Bundle)jest wywoływana, gdy czynność jest uruchamiana po raz pierwszy. Możesz go użyć do wykonania jednorazowej inicjalizacji, takiej jak utworzenie interfejsu użytkownika. onCreate()przyjmuje jeden parametr, który ma wartość null lub niektóre informacje o stanie wcześniej zapisane przez onSaveInstanceState.


0

onCreate (pakiet zapisanyInstanceState) zostanie wywołany, a parametr saveInstanceState będzie różny od zera, jeśli Twoja aktywność została zakończona w scenariuszu (widok wizualny) opisanym powyżej. Twoja aplikacja może następnie pobrać (przechwycić) dane z saveInstanceState i ponownie wygenerować Twoją aktywność

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.